You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ta...@apache.org on 2013/11/08 11:36:24 UTC
[05/29] Revert "CLOUSTACK-5099: Utils.py-has-wrong-reference,
cleaned it. As well added Uniform naming convention"
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/cloudstackAPI/updateZone.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/cloudstackAPI/updateZone.py b/tools/marvin/build/lib/marvin/cloudstackAPI/updateZone.py
deleted file mode 100644
index b1b4360..0000000
--- a/tools/marvin/build/lib/marvin/cloudstackAPI/updateZone.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-"""Updates a Zone."""
-from baseCmd import *
-from baseResponse import *
-class updateZoneCmd (baseCmd):
- def __init__(self):
- self.isAsync = "false"
- """the ID of the Zone"""
- """Required"""
- self.id = None
- """Allocation state of this cluster for allocation of new resources"""
- self.allocationstate = None
- """the details for the Zone"""
- self.details = []
- """the dhcp Provider for the Zone"""
- self.dhcpprovider = None
- """the first DNS for the Zone"""
- self.dns1 = None
- """the second DNS for the Zone"""
- self.dns2 = None
- """the dns search order list"""
- self.dnssearchorder = []
- """Network domain name for the networks in the zone; empty string will update domain with NULL value"""
- self.domain = None
- """the guest CIDR address for the Zone"""
- self.guestcidraddress = None
- """the first internal DNS for the Zone"""
- self.internaldns1 = None
- """the second internal DNS for the Zone"""
- self.internaldns2 = None
- """the first DNS for IPv6 network in the Zone"""
- self.ip6dns1 = None
- """the second DNS for IPv6 network in the Zone"""
- self.ip6dns2 = None
- """updates a private zone to public if set, but not vice-versa"""
- self.ispublic = None
- """true if local storage offering enabled, false otherwise"""
- self.localstorageenabled = None
- """the name of the Zone"""
- self.name = None
- self.required = ["id",]
-
-class updateZoneResponse (baseResponse):
- def __init__(self):
- """Zone id"""
- self.id = None
- """the allocation state of the cluster"""
- self.allocationstate = None
- """Zone description"""
- self.description = None
- """the dhcp Provider for the Zone"""
- self.dhcpprovider = None
- """the display text of the zone"""
- self.displaytext = None
- """the first DNS for the Zone"""
- self.dns1 = None
- """the second DNS for the Zone"""
- self.dns2 = None
- """Network domain name for the networks in the zone"""
- self.domain = None
- """the UUID of the containing domain, null for public zones"""
- self.domainid = None
- """the name of the containing domain, null for public zones"""
- self.domainname = None
- """the guest CIDR address for the Zone"""
- self.guestcidraddress = None
- """the first internal DNS for the Zone"""
- self.internaldns1 = None
- """the second internal DNS for the Zone"""
- self.internaldns2 = None
- """the first IPv6 DNS for the Zone"""
- self.ip6dns1 = None
- """the second IPv6 DNS for the Zone"""
- self.ip6dns2 = None
- """true if local storage offering enabled, false otherwise"""
- self.localstorageenabled = None
- """Zone name"""
- self.name = None
- """the network type of the zone; can be Basic or Advanced"""
- self.networktype = None
- """true if security groups support is enabled, false otherwise"""
- self.securitygroupsenabled = None
- """the vlan range of the zone"""
- self.vlan = None
- """Zone Token"""
- self.zonetoken = None
- """the capacity of the Zone"""
- self.capacity = []
- """the list of resource tags associated with zone."""
- self.tags = []
-
-class capacity:
- def __init__(self):
- """"the total capacity available"""
- self.capacitytotal = None
- """"the capacity currently in use"""
- self.capacityused = None
- """"the Cluster ID"""
- self.clusterid = None
- """"the Cluster name"""
- self.clustername = None
- """"the percentage of capacity currently in use"""
- self.percentused = None
- """"the Pod ID"""
- self.podid = None
- """"the Pod name"""
- self.podname = None
- """"the capacity type"""
- self.type = None
- """"the Zone ID"""
- self.zoneid = None
- """"the Zone name"""
- self.zonename = None
-
-class tags:
- def __init__(self):
- """"the account associated with the tag"""
- self.account = None
- """"customer associated with the tag"""
- self.customer = None
- """"the domain associated with the tag"""
- self.domain = None
- """"the ID of the domain associated with the tag"""
- self.domainid = None
- """"tag key name"""
- self.key = None
- """"the project name where tag belongs to"""
- self.project = None
- """"the project id the tag belongs to"""
- self.projectid = None
- """"id of the resource"""
- self.resourceid = None
- """"resource type"""
- self.resourcetype = None
- """"tag value"""
- self.value = None
-
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/cloudstackAPI/uploadCustomCertificate.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/cloudstackAPI/uploadCustomCertificate.py b/tools/marvin/build/lib/marvin/cloudstackAPI/uploadCustomCertificate.py
deleted file mode 100644
index d84f448..0000000
--- a/tools/marvin/build/lib/marvin/cloudstackAPI/uploadCustomCertificate.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-"""Uploads a custom certificate for the console proxy VMs to use for SSL. Can be used to upload a single certificate signed by a known CA. Can also be used, through multiple calls, to upload a chain of certificates from CA to the custom certificate itself."""
-from baseCmd import *
-from baseResponse import *
-class uploadCustomCertificateCmd (baseCmd):
- def __init__(self):
- self.isAsync = "true"
- """The certificate to be uploaded."""
- """Required"""
- self.certificate = None
- """DNS domain suffix that the certificate is granted for."""
- """Required"""
- self.domainsuffix = None
- """An integer providing the location in a chain that the certificate will hold. Usually, this can be left empty. When creating a chain, the top level certificate should have an ID of 1, with each step in the chain incrementing by one. Example, CA with id = 1, Intermediate CA with id = 2, Site certificate with ID = 3"""
- self.id = None
- """A name / alias for the certificate."""
- self.name = None
- """The private key for the attached certificate."""
- self.privatekey = None
- self.required = ["certificate","domainsuffix",]
-
-class uploadCustomCertificateResponse (baseResponse):
- def __init__(self):
- """message of the certificate upload operation"""
- self.message = None
-
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/cloudstackAPI/uploadVolume.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/cloudstackAPI/uploadVolume.py b/tools/marvin/build/lib/marvin/cloudstackAPI/uploadVolume.py
deleted file mode 100644
index acd4a0e..0000000
--- a/tools/marvin/build/lib/marvin/cloudstackAPI/uploadVolume.py
+++ /dev/null
@@ -1,162 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-"""Uploads a data disk."""
-from baseCmd import *
-from baseResponse import *
-class uploadVolumeCmd (baseCmd):
- def __init__(self):
- self.isAsync = "true"
- """the format for the volume. Possible values include QCOW2, OVA, and VHD."""
- """Required"""
- self.format = None
- """the name of the volume"""
- """Required"""
- self.name = None
- """the URL of where the volume is hosted. Possible URL include http:// and https://"""
- """Required"""
- self.url = None
- """the ID of the zone the volume is to be hosted on"""
- """Required"""
- self.zoneid = None
- """an optional accountName. Must be used with domainId."""
- self.account = None
- """the MD5 checksum value of this volume"""
- self.checksum = None
- """an optional domainId. If the account parameter is used, domainId must also be used."""
- self.domainid = None
- """Image store uuid"""
- self.imagestoreuuid = None
- """Upload volume for the project"""
- self.projectid = None
- self.required = ["format","name","url","zoneid",]
-
-class uploadVolumeResponse (baseResponse):
- def __init__(self):
- """ID of the disk volume"""
- self.id = None
- """the account associated with the disk volume"""
- self.account = None
- """the date the volume was attached to a VM instance"""
- self.attached = None
- """the date the disk volume was created"""
- self.created = None
- """the boolean state of whether the volume is destroyed or not"""
- self.destroyed = None
- """the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached."""
- self.deviceid = None
- """bytes read rate of the disk volume"""
- self.diskBytesReadRate = None
- """bytes write rate of the disk volume"""
- self.diskBytesWriteRate = None
- """io requests read rate of the disk volume"""
- self.diskIopsReadRate = None
- """io requests write rate of the disk volume"""
- self.diskIopsWriteRate = None
- """the display text of the disk offering"""
- self.diskofferingdisplaytext = None
- """ID of the disk offering"""
- self.diskofferingid = None
- """name of the disk offering"""
- self.diskofferingname = None
- """an optional field whether to the display the volume to the end user or not."""
- self.displayvolume = None
- """the domain associated with the disk volume"""
- self.domain = None
- """the ID of the domain associated with the disk volume"""
- self.domainid = None
- """Hypervisor the volume belongs to"""
- self.hypervisor = None
- """true if the volume is extractable, false otherwise"""
- self.isextractable = None
- """max iops of the disk volume"""
- self.maxiops = None
- """min iops of the disk volume"""
- self.miniops = None
- """name of the disk volume"""
- self.name = None
- """The path of the volume"""
- self.path = None
- """the project name of the vpn"""
- self.project = None
- """the project id of the vpn"""
- self.projectid = None
- """the display text of the service offering for root disk"""
- self.serviceofferingdisplaytext = None
- """ID of the service offering for root disk"""
- self.serviceofferingid = None
- """name of the service offering for root disk"""
- self.serviceofferingname = None
- """size of the disk volume"""
- self.size = None
- """ID of the snapshot from which this volume was created"""
- self.snapshotid = None
- """the state of the disk volume"""
- self.state = None
- """the status of the volume"""
- self.status = None
- """name of the primary storage hosting the disk volume"""
- self.storage = None
- """id of the primary storage hosting the disk volume; returned to admin user only"""
- self.storageid = None
- """shared or local storage"""
- self.storagetype = None
- """type of the disk volume (ROOT or DATADISK)"""
- self.type = None
- """id of the virtual machine"""
- self.virtualmachineid = None
- """display name of the virtual machine"""
- self.vmdisplayname = None
- """name of the virtual machine"""
- self.vmname = None
- """state of the virtual machine"""
- self.vmstate = None
- """ID of the availability zone"""
- self.zoneid = None
- """name of the availability zone"""
- self.zonename = None
- """the list of resource tags associated with volume"""
- self.tags = []
- """the ID of the latest async job acting on this object"""
- self.jobid = None
- """the current status of the latest async job acting on this object"""
- self.jobstatus = None
-
-class tags:
- def __init__(self):
- """"the account associated with the tag"""
- self.account = None
- """"customer associated with the tag"""
- self.customer = None
- """"the domain associated with the tag"""
- self.domain = None
- """"the ID of the domain associated with the tag"""
- self.domainid = None
- """"tag key name"""
- self.key = None
- """"the project name where tag belongs to"""
- self.project = None
- """"the project id the tag belongs to"""
- self.projectid = None
- """"id of the resource"""
- self.resourceid = None
- """"resource type"""
- self.resourcetype = None
- """"tag value"""
- self.value = None
-
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/cloudstackConnection.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/cloudstackConnection.py b/tools/marvin/build/lib/marvin/cloudstackConnection.py
deleted file mode 100644
index 686c533..0000000
--- a/tools/marvin/build/lib/marvin/cloudstackConnection.py
+++ /dev/null
@@ -1,235 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import requests
-import urllib
-import base64
-import hmac
-import hashlib
-import logging
-import time
-import cloudstackException
-from cloudstackAPI import *
-import jsonHelper
-from requests import ConnectionError
-from requests import HTTPError
-from requests import Timeout
-from requests import RequestException
-
-
-class cloudConnection(object):
-
- """ Connections to make API calls to the cloudstack management server
- """
-
- def __init__(self, mgtSvr, port=8096, user=None, passwd=None,
- apiKey=None, securityKey=None,
- asyncTimeout=3600, logging=None, scheme='http',
- path='client/api'):
- self.loglevel() # Turn off requests logs
- self.apiKey = apiKey
- self.securityKey = securityKey
- self.mgtSvr = mgtSvr
- self.port = port
- self.user = user
- self.passwd = passwd
- self.logging = logging
- self.path = path
- self.retries = 5
- self.asyncTimeout = asyncTimeout
- self.auth = True
- if port == 8096 or \
- (self.apiKey is None and self.securityKey is None):
- self.auth = False
- if scheme not in ['http', 'https']:
- raise RequestException("Protocol must be HTTP")
- self.protocol = scheme
- self.baseurl = "%s://%s:%d/%s"\
- % (self.protocol, self.mgtSvr, self.port, self.path)
-
- def __copy__(self):
- return cloudConnection(self.mgtSvr, self.port, self.user, self.passwd,
- self.apiKey, self.securityKey,
- self.asyncTimeout, self.logging, self.protocol,
- self.path)
-
- def loglevel(self, lvl=logging.WARNING):
- """
- Turns off the INFO/DEBUG logs from `requests`
- """
- requests_log = logging.getLogger("requests")
- requests_log.setLevel(lvl)
-
- def poll(self, jobid, response):
- """
- polls the completion of a given jobid
- @param jobid:
- @param response:
- @return:
- """
- cmd = queryAsyncJobResult.queryAsyncJobResultCmd()
- cmd.jobid = jobid
- timeout = self.asyncTimeout
-
- while timeout > 0:
- asyncResonse = self.marvin_request(cmd, response_type=response)
-
- if asyncResonse.jobstatus == 2:
- raise cloudstackException.cloudstackAPIException(
- "asyncquery", asyncResonse.jobresult)
- elif asyncResonse.jobstatus == 1:
- return asyncResonse
-
- time.sleep(5)
- if self.logging is not None:
- self.logging.debug("job: %s still processing,"
- " will timeout in %ds" % (jobid, timeout))
- timeout = timeout - 5
-
- raise cloudstackException.cloudstackAPIException(
- "asyncquery", "Async job timeout %s" % jobid)
-
- def sign(self, payload):
- """
- signs a given request URL when the apiKey and secretKey are known
-
- @param payload: dict of GET params to be signed
- @return: the signature of the payload
- """
- params = zip(payload.keys(), payload.values())
- params.sort(key=lambda k: str.lower(k[0]))
- hashStr = "&".join(
- ["=".join(
- [str.lower(r[0]),
- str.lower(
- urllib.quote_plus(str(r[1]))
- ).replace("+", "%20")]
- ) for r in params]
- )
- signature = base64.encodestring(hmac.new(
- self.securityKey, hashStr, hashlib.sha1).digest()).strip()
- self.logging.debug("Computed Signature by Marvin: %s" % signature)
- return signature
-
- def request(self, command, auth=True, payload={}, method='GET'):
- """
- Makes requests using auth or over integration port
- @param command: cloudstack API command name
- eg: deployVirtualMachineCommand
- @param auth: Authentication (apikey,secretKey) => True
- else False for integration.api.port
- @param payload: request data composed as a dictionary
- @param method: GET/POST via HTTP
- @return:
- """
- payload["command"] = command
- payload["response"] = "json"
-
- if auth:
- payload["apiKey"] = self.apiKey
- signature = self.sign(payload)
- payload["signature"] = signature
-
- try:
- if method == 'POST':
- response = requests.post(
- self.baseurl, params=payload, verify=False)
- else:
- response = requests.get(
- self.baseurl, params=payload, verify=False)
- except ConnectionError, c:
- self.logging.debug("Connection refused. Reason: %s : %s" %
- (self.baseurl, c))
- raise c
- except HTTPError, h:
- self.logging.debug("Server returned error code: %s" % h)
- raise h
- except Timeout, t:
- self.logging.debug("Connection timed out with %s" % t)
- raise t
- except RequestException, r:
- self.logging.debug("Error returned by server %s" % r)
- raise r
- else:
- return response
-
- def sanitize_command(self, cmd):
- """
- Removes None values, Validates all required params are present
- @param cmd: Cmd object eg: createPhysicalNetwork
- @return:
- """
- requests = {}
- required = []
- for attribute in dir(cmd):
- if not attribute.startswith('__'):
- if attribute == "isAsync":
- isAsync = getattr(cmd, attribute)
- elif attribute == "required":
- required = getattr(cmd, attribute)
- else:
- requests[attribute] = getattr(cmd, attribute)
-
- cmdname = cmd.__class__.__name__.replace("Cmd", "")
- for requiredPara in required:
- if requests[requiredPara] is None:
- raise cloudstackException.cloudstackAPIException(
- cmdname, "%s is required" % requiredPara)
- for param, value in requests.items():
- if value is None:
- requests.pop(param)
- elif isinstance(value, list):
- if len(value) == 0:
- requests.pop(param)
- else:
- if not isinstance(value[0], dict):
- requests[param] = ",".join(value)
- else:
- requests.pop(param)
- i = 0
- for val in value:
- for k, v in val.iteritems():
- requests["%s[%d].%s" % (param, i, k)] = v
- i = i + 1
- return cmdname, isAsync, requests
-
- def marvin_request(self, cmd, response_type=None, method='GET', data=''):
- """
- Requester for marvin command objects
- @param cmd: marvin's command from cloudstackAPI
- @param response_type: response type of the command in cmd
- @param method: HTTP GET/POST, defaults to GET
- @return:
- """
- cmdname, isAsync, payload = self.sanitize_command(cmd)
- self.logging.debug("sending %s request: %s %s" % (method, cmdname,
- str(payload)))
- response = self.request(
- cmdname, self.auth, payload=payload, method=method)
- self.logging.debug("Request: %s Response: %s" %
- (response.url, response.text))
- try:
- response = jsonHelper.getResultObj(response.json(), response_type)
- except TypeError:
- response = jsonHelper.getResultObj(response.json, response_type)
-
- if isAsync == "false":
- return response
- else:
- asyncJobId = response.jobid
- response = self.poll(asyncJobId, response_type)
- return response.jobresult
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/cloudstackException.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/cloudstackException.py b/tools/marvin/build/lib/marvin/cloudstackException.py
deleted file mode 100644
index 6200003..0000000
--- a/tools/marvin/build/lib/marvin/cloudstackException.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-class cloudstackAPIException(Exception):
- def __init__(self, cmd="", result=""):
- self.errorMsg = "Execute cmd: %s failed, due to: %s" % (cmd, result)
-
- def __str__(self):
- return self.errorMsg
-
-
-class InvalidParameterException(Exception):
- def __init__(self, msg=''):
- self.errorMsg = msg
-
- def __str__(self):
- return self.errorMsg
-
-
-class dbException(Exception):
- def __init__(self, msg=''):
- self.errorMsg = msg
-
- def __str__(self):
- return self.errorMsg
-
-
-class internalError(Exception):
- def __init__(self, msg=''):
- self.errorMsg = msg
-
- def __str__(self):
- return self.errorMsg
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/cloudstackTestCase.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/cloudstackTestCase.py b/tools/marvin/build/lib/marvin/cloudstackTestCase.py
deleted file mode 100644
index 85ef542..0000000
--- a/tools/marvin/build/lib/marvin/cloudstackTestCase.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import unittest
-
-
-def user(Name, DomainName, AcctType):
- def wrapper(cls):
- orig_init = cls.__init__
-
- def __init__(self, *args, **kws):
- cls.UserName = Name
- cls.DomainName = DomainName
- cls.AcctType = AcctType
- orig_init(self, *args, **kws)
- cls.__init__ = __init__
- return cls
- return wrapper
-
-
-class cloudstackTestCase(unittest.case.TestCase):
- clstestclient = None
-
- @classmethod
- def getClsTestClient(cls):
- return cls.clstestclient
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/cloudstackTestClient.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/cloudstackTestClient.py b/tools/marvin/build/lib/marvin/cloudstackTestClient.py
deleted file mode 100644
index 36f7f8d..0000000
--- a/tools/marvin/build/lib/marvin/cloudstackTestClient.py
+++ /dev/null
@@ -1,201 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import cloudstackConnection
-import asyncJobMgr
-import dbConnection
-from cloudstackAPI import *
-import random
-import string
-import hashlib
-
-
-class cloudstackTestClient(object):
- def __init__(self, mgtSvr=None, port=8096, user=None, passwd=None,
- apiKey=None, securityKey=None, asyncTimeout=3600,
- defaultWorkerThreads=10, logging=None):
- self.connection = \
- cloudstackConnection.cloudConnection(mgtSvr, port, user, passwd,
- apiKey, securityKey,
- asyncTimeout, logging)
- self.apiClient =\
- cloudstackAPIClient.CloudStackAPIClient(self.connection)
- self.dbConnection = None
- self.asyncJobMgr = None
- self.ssh = None
- self.id = None
- self.defaultWorkerThreads = defaultWorkerThreads
-
- @property
- def identifier(self):
- return self.id
-
- @identifier.setter
- def identifier(self, id):
- self.id = id
-
- def dbConfigure(self, host="localhost", port=3306, user='cloud',
- passwd='cloud', db='cloud'):
- self.dbConnection = dbConnection.dbConnection(host, port, user, passwd,
- db)
-
- def isAdminContext(self):
- """
- A user is a regular user if he fails to listDomains;
- if he is a domain-admin, he can list only domains that are non-ROOT;
- if he is an admin, he can list the ROOT domain successfully
- """
- try:
- listdom = listDomains.listDomainsCmd()
- listdom.name = 'ROOT'
- listdomres = self.apiClient.listDomains(listdom)
- rootdom = listdomres[0].name
- if rootdom == 'ROOT':
- return 1 # admin
- else:
- return 2 # domain-admin
- except:
- return 0 # user
-
- def random_gen(self, size=6, chars=string.ascii_uppercase + string.digits):
- """Generate Random Strings of variable length"""
- randomstr = ''.join(random.choice(chars) for x in range(size))
- if self.identifier:
- return ''.join([self.identifier, '-', randomstr])
- return randomstr
-
- def createUserApiClient(self, UserName, DomainName, acctType=0):
- if not self.isAdminContext():
- return self.apiClient
-
- listDomain = listDomains.listDomainsCmd()
- listDomain.listall = True
- listDomain.name = DomainName
- try:
- domains = self.apiClient.listDomains(listDomain)
- domId = domains[0].id
- except:
- cdomain = createDomain.createDomainCmd()
- cdomain.name = DomainName
- domain = self.apiClient.createDomain(cdomain)
- domId = domain.id
-
- cmd = listAccounts.listAccountsCmd()
- cmd.name = UserName
- cmd.domainid = domId
- try:
- accounts = self.apiClient.listAccounts(cmd)
- acctId = accounts[0].id
- except:
- createAcctCmd = createAccount.createAccountCmd()
- createAcctCmd.accounttype = acctType
- createAcctCmd.domainid = domId
- createAcctCmd.email = "test-" + self.random_gen()\
- + "@cloudstack.org"
- createAcctCmd.firstname = UserName
- createAcctCmd.lastname = UserName
- createAcctCmd.password = 'password'
- createAcctCmd.username = UserName
- acct = self.apiClient.createAccount(createAcctCmd)
- acctId = acct.id
-
- listuser = listUsers.listUsersCmd()
- listuser.username = UserName
-
- listuserRes = self.apiClient.listUsers(listuser)
- userId = listuserRes[0].id
- apiKey = listuserRes[0].apikey
- securityKey = listuserRes[0].secretkey
-
- if apiKey is None:
- registerUser = registerUserKeys.registerUserKeysCmd()
- registerUser.id = userId
- registerUserRes = self.apiClient.registerUserKeys(registerUser)
- apiKey = registerUserRes.apikey
- securityKey = registerUserRes.secretkey
-
- newUserConnection =\
- cloudstackConnection.cloudConnection(self.connection.mgtSvr,
- self.connection.port,
- self.connection.user,
- self.connection.passwd,
- apiKey, securityKey,
- self.connection.asyncTimeout,
- self.connection.logging)
- self.userApiClient =\
- cloudstackAPIClient.CloudStackAPIClient(newUserConnection)
- self.userApiClient.connection = newUserConnection
- self.userApiClient.hypervisor = self.apiClient.hypervisor
- return self.userApiClient
-
- def close(self):
- if self.connection is not None:
- self.connection.close()
-
- def getDbConnection(self):
- return self.dbConnection
-
- def executeSql(self, sql=None):
- if sql is None or self.dbConnection is None:
- return None
-
- return self.dbConnection.execute()
-
- def executeSqlFromFile(self, sqlFile=None):
- if sqlFile is None or self.dbConnection is None:
- return None
- return self.dbConnection.executeSqlFromFile(sqlFile)
-
- def getApiClient(self):
- self.apiClient.id = self.identifier
- return self.apiClient
-
- def getUserApiClient(self, account, domain, type=0):
- """
- 0 - user
- 1 - admin
- 2 - domain admin
- """
- self.createUserApiClient(account, domain, type)
- if hasattr(self, "userApiClient"):
- return self.userApiClient
- return None
-
- def submitCmdsAndWait(self, cmds, workers=1):
- '''FixME, httplib has issue if more than one thread submitted'''
- if self.asyncJobMgr is None:
- self.asyncJobMgr = asyncJobMgr.asyncJobMgr(self.apiClient,
- self.dbConnection)
- return self.asyncJobMgr.submitCmdsAndWait(cmds, workers)
-
- def submitJob(self, job, ntimes=1, nums_threads=10, interval=1):
- '''
- submit one job and execute the same job ntimes, with nums_threads
- of threads
- '''
- if self.asyncJobMgr is None:
- self.asyncJobMgr = asyncJobMgr.asyncJobMgr(self.apiClient,
- self.dbConnection)
- self.asyncJobMgr.submitJobExecuteNtimes(job, ntimes, nums_threads,
- interval)
-
- def submitJobs(self, jobs, nums_threads=10, interval=1):
- '''submit n jobs, execute them with nums_threads of threads'''
- if self.asyncJobMgr is None:
- self.asyncJobMgr = asyncJobMgr.asyncJobMgr(self.apiClient,
- self.dbConnection)
- self.asyncJobMgr.submitJobs(jobs, nums_threads, interval)
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/codegenerator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/codegenerator.py b/tools/marvin/build/lib/marvin/codegenerator.py
deleted file mode 100644
index 96729f6..0000000
--- a/tools/marvin/build/lib/marvin/codegenerator.py
+++ /dev/null
@@ -1,463 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import xml.dom.minidom
-import json
-from optparse import OptionParser
-from textwrap import dedent
-import os
-import sys
-import urllib2
-
-
-class cmdParameterProperty(object):
- def __init__(self):
- self.name = None
- self.required = False
- self.desc = ""
- self.type = "planObject"
- self.subProperties = []
-
-
-class cloudStackCmd(object):
- def __init__(self):
- self.name = ""
- self.desc = ""
- self.async = "false"
- self.request = []
- self.response = []
-
-
-class codeGenerator(object):
- """
- Apache CloudStack- marvin python classes can be generated from the json
- returned by API discovery or from the xml spec of commands generated by
- the ApiDocWriter. This class provides helper methods for these uses.
- """
- space = ' '
- newline = '\n'
- cmdsName = []
-
- def __init__(self, outputFolder):
- self.cmd = None
- self.code = ""
- self.required = []
- self.subclass = []
- self.outputFolder = outputFolder
- lic = """\
- # Licensed to the Apache Software Foundation (ASF) under one
- # or more contributor license agreements. See the NOTICE file
- # distributed with this work for additional information
- # regarding copyright ownership. The 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.
-
- """
- self.license = dedent(lic)
-
- def addAttribute(self, attr, pro):
- value = pro.value
- if pro.required:
- self.required.append(attr)
- desc = pro.desc
- if desc is not None:
- self.code += self.space
- self.code += "''' " + pro.desc + " '''"
- self.code += self.newline
-
- self.code += self.space
- self.code += attr + " = " + str(value)
- self.code += self.newline
-
- def generateSubClass(self, name, properties):
- '''generate code for sub list'''
- subclass = 'class %s:\n' % name
- subclass += self.space + "def __init__(self):\n"
- for pro in properties:
- if pro.desc is not None:
- subclass += self.space + self.space + '""""%s"""\n' % pro.desc
- if len(pro.subProperties) > 0:
- subclass += self.space + self.space
- subclass += 'self.%s = []\n' % pro.name
- self.generateSubClass(pro.name, pro.subProperties)
- else:
- subclass += self.space + self.space
- subclass += 'self.%s = None\n' % pro.name
-
- self.subclass.append(subclass)
-
- def generate(self, cmd):
-
- self.cmd = cmd
- self.cmdsName.append(self.cmd.name)
- self.code = self.license
- self.code += self.newline
- self.code += '"""%s"""\n' % self.cmd.desc
- self.code += 'from baseCmd import *\n'
- self.code += 'from baseResponse import *\n'
- self.code += "class %sCmd (baseCmd):\n" % self.cmd.name
- self.code += self.space + "def __init__(self):\n"
-
- self.code += self.space + self.space
- self.code += 'self.isAsync = "%s"\n' % str(self.cmd.async).lower()
-
- for req in self.cmd.request:
- if req.desc is not None:
- self.code += self.space + self.space + '"""%s"""\n' % req.desc
- if req.required == "true":
- self.code += self.space + self.space + '"""Required"""\n'
-
- value = "None"
- if req.type == "list" or req.type == "map":
- value = "[]"
-
- self.code += self.space + self.space
- self.code += 'self.%s = %s\n' % (req.name, value)
- if req.required == "true":
- self.required.append(req.name)
-
- self.code += self.space + self.space + "self.required = ["
- for require in self.required:
- self.code += '"' + require + '",'
- self.code += "]\n"
- self.required = []
-
- """generate response code"""
- subItems = {}
- self.code += self.newline
- self.code += 'class %sResponse (baseResponse):\n' % self.cmd.name
- self.code += self.space + "def __init__(self):\n"
- if len(self.cmd.response) == 0:
- self.code += self.space + self.space + "pass"
- else:
- for res in self.cmd.response:
- if res.desc is not None:
- self.code += self.space + self.space
- self.code += '"""%s"""\n' % res.desc
-
- if len(res.subProperties) > 0:
- self.code += self.space + self.space
- self.code += 'self.%s = []\n' % res.name
- self.generateSubClass(res.name, res.subProperties)
- else:
- self.code += self.space + self.space
- self.code += 'self.%s = None\n' % res.name
- self.code += self.newline
-
- for subclass in self.subclass:
- self.code += subclass + "\n"
-
- fp = open(self.outputFolder + "/cloudstackAPI/%s.py" % self.cmd.name,
- "w")
- fp.write(self.code)
- fp.close()
- self.code = ""
- self.subclass = []
-
- def finalize(self):
- '''generate an api call'''
-
- header = '"""Test Client for CloudStack API"""\n'
- imports = "import copy\n"
- initCmdsList = '__all__ = ['
- body = ''
- body += "class CloudStackAPIClient(object):\n"
- body += self.space + 'def __init__(self, connection):\n'
- body += self.space + self.space + 'self.connection = connection\n'
- body += self.space + self.space + 'self._id = None\n'
- body += self.newline
-
- body += self.space + 'def __copy__(self):\n'
- body += self.space + self.space
- body += 'return CloudStackAPIClient(copy.copy(self.connection))\n'
- body += self.newline
-
- # The `id` property will be used to link the test with the cloud
- # resource being created
- # @property
- # def id(self):
- # return self._id
- #
- # @id.setter
- # def id(self, identifier):
- # self._id = identifier
-
- body += self.space + '@property' + self.newline
- body += self.space + 'def id(self):' + self.newline
- body += self.space*2 + 'return self._id' + self.newline
- body += self.newline
-
- body += self.space + '@id.setter' + self.newline
- body += self.space + 'def id(self, identifier):' + self.newline
- body += self.space*2 + 'self._id = identifier' + self.newline
- body += self.newline
-
- for cmdName in self.cmdsName:
- body += self.space
- body += 'def %s(self, command, method="GET"):\n' % cmdName
- body += self.space + self.space
- body += 'response = %sResponse()\n' % cmdName
- body += self.space + self.space
- body += 'response = self.connection.marvin_request(command,'
- body += ' response_type=response, method=method)\n'
- body += self.space + self.space + 'return response\n'
- body += self.newline
-
- imports += 'from %s import %sResponse\n' % (cmdName, cmdName)
- initCmdsList += '"%s",' % cmdName
-
- fp = open(self.outputFolder + '/cloudstackAPI/cloudstackAPIClient.py',
- 'w')
- fp.write(self.license)
- for item in [header, imports, body]:
- fp.write(item)
- fp.close()
-
- '''generate __init__.py'''
- initCmdsList = self.license + initCmdsList + '"cloudstackAPIClient"]'
- fp = open(self.outputFolder + '/cloudstackAPI/__init__.py', 'w')
- fp.write(initCmdsList)
- fp.close()
-
- fp = open(self.outputFolder + '/cloudstackAPI/baseCmd.py', 'w')
- basecmd = self.license
- basecmd += '"""Base Command"""\n'
- basecmd += 'class baseCmd(object):\n'
- basecmd += self.space + 'pass\n'
- fp.write(basecmd)
- fp.close()
-
- fp = open(self.outputFolder + '/cloudstackAPI/baseResponse.py', 'w')
- basecmd = self.license
- basecmd += '"""Base class for response"""\n'
- basecmd += 'class baseResponse(object):\n'
- basecmd += self.space + 'pass\n'
- fp.write(basecmd)
- fp.close()
-
- def constructResponseFromXML(self, response):
- paramProperty = cmdParameterProperty()
- paramProperty.name = getText(response.getElementsByTagName('name'))
- paramProperty.desc = getText(response.
- getElementsByTagName('description'))
- if paramProperty.name.find('(*)') != -1:
- '''This is a list'''
- paramProperty.name = paramProperty.name.split('(*)')[0]
- argList = response.getElementsByTagName('arguments')[0].\
- getElementsByTagName('arg')
- for subresponse in argList:
- subProperty = self.constructResponseFromXML(subresponse)
- paramProperty.subProperties.append(subProperty)
- return paramProperty
-
- def loadCmdFromXML(self, dom):
- cmds = []
- for cmd in dom.getElementsByTagName("command"):
- csCmd = cloudStackCmd()
- csCmd.name = getText(cmd.getElementsByTagName('name'))
- assert csCmd.name
-
- desc = getText(cmd.getElementsByTagName('description'))
- if desc:
- csCmd.desc = desc
-
- async = getText(cmd.getElementsByTagName('isAsync'))
- if async:
- csCmd.async = async
-
- argList = cmd.getElementsByTagName("request")[0].\
- getElementsByTagName("arg")
- for param in argList:
- paramProperty = cmdParameterProperty()
-
- paramProperty.name =\
- getText(param.getElementsByTagName('name'))
- assert paramProperty.name
-
- required = param.getElementsByTagName('required')
- if required:
- paramProperty.required = getText(required)
-
- requestDescription = param.getElementsByTagName('description')
- if requestDescription:
- paramProperty.desc = getText(requestDescription)
-
- type = param.getElementsByTagName("type")
- if type:
- paramProperty.type = getText(type)
-
- csCmd.request.append(paramProperty)
-
- responseEle = cmd.getElementsByTagName("response")[0]
- for response in responseEle.getElementsByTagName("arg"):
- if response.parentNode != responseEle:
- continue
-
- paramProperty = self.constructResponseFromXML(response)
- csCmd.response.append(paramProperty)
-
- cmds.append(csCmd)
- return cmds
-
- def generateCodeFromXML(self, apiSpecFile):
- dom = xml.dom.minidom.parse(apiSpecFile)
- cmds = self.loadCmdFromXML(dom)
- for cmd in cmds:
- self.generate(cmd)
- self.finalize()
-
- def constructResponseFromJSON(self, response):
- paramProperty = cmdParameterProperty()
- if 'name' in response:
- paramProperty.name = response['name']
- assert paramProperty.name, "%s has no property name" % response
-
- if 'description' in response:
- paramProperty.desc = response['description']
- if 'type' in response:
- if response['type'] in ['list', 'map', 'set']:
- #Here list becomes a subproperty
- if 'response' in response:
- for innerResponse in response['response']:
- subProperty =\
- self.constructResponseFromJSON(innerResponse)
- paramProperty.subProperties.append(subProperty)
- paramProperty.type = response['type']
- return paramProperty
-
- def loadCmdFromJSON(self, apiStream):
- if apiStream is None:
- raise Exception("No APIs found through discovery")
-
- jsonOut = apiStream.readlines()
- assert len(jsonOut) > 0
- apiDict = json.loads(jsonOut[0])
- if not 'listapisresponse' in apiDict:
- raise Exception("API discovery plugin response failed")
- if not 'count' in apiDict['listapisresponse']:
- raise Exception("Malformed api response")
-
- apilist = apiDict['listapisresponse']['api']
- cmds = []
- for cmd in apilist:
- csCmd = cloudStackCmd()
- if 'name' in cmd:
- csCmd.name = cmd['name']
- assert csCmd.name
-
- if 'description' in cmd:
- csCmd.desc = cmd['description']
-
- if 'isasync' in cmd:
- csCmd.async = cmd['isasync']
-
- for param in cmd['params']:
- paramProperty = cmdParameterProperty()
-
- if 'name' in param:
- paramProperty.name = param['name']
- assert paramProperty.name
-
- if 'required' in param:
- paramProperty.required = param['required']
-
- if 'description' in param:
- paramProperty.desc = param['description']
-
- if 'type' in param:
- paramProperty.type = param['type']
-
- csCmd.request.append(paramProperty)
-
- for response in cmd['response']:
- #FIXME: ExtractImage related APIs return empty dicts in response
- if len(response) > 0:
- paramProperty = self.constructResponseFromJSON(response)
- csCmd.response.append(paramProperty)
-
- cmds.append(csCmd)
- return cmds
-
- def generateCodeFromJSON(self, endpointUrl):
- """
- Api Discovery plugin returns the supported APIs of a CloudStack
- endpoint.
- @return: The classes in cloudstackAPI/ formed from api discovery json
- """
- if endpointUrl.find('response=json') >= 0:
- apiStream = urllib2.urlopen(endpointUrl)
- cmds = self.loadCmdFromJSON(apiStream)
- for cmd in cmds:
- self.generate(cmd)
- self.finalize()
-
-
-def getText(elements):
- return elements[0].childNodes[0].nodeValue.strip()
-
-if __name__ == "__main__":
- parser = OptionParser()
- parser.add_option("-o", "--output", dest="output",
- help="The path to the generated code entities, default\
- is .")
- parser.add_option("-s", "--specfile", dest="spec",
- help="The path and name of the api spec xml file,\
- default is /etc/cloud/cli/commands.xml")
- parser.add_option("-e", "--endpoint", dest="endpoint",
- help="The endpoint mgmt server (with open 8096) where\
- apis are discovered, default is localhost")
-
- (options, args) = parser.parse_args()
-
- folder = "."
- if options.output is not None:
- folder = options.output
- apiModule = folder + "/cloudstackAPI"
- if not os.path.exists(apiModule):
- try:
- os.mkdir(apiModule)
- except:
- print "Failed to create folder %s, due to %s" % (apiModule,
- sys.exc_info())
- print parser.print_help()
- exit(2)
-
- apiSpecFile = "/etc/cloud/cli/commands.xml"
- if options.spec is not None:
- apiSpecFile = options.spec
- if not os.path.exists(apiSpecFile):
- print "the spec file %s does not exists" % apiSpecFile
- print parser.print_help()
- exit(1)
-
- cg = codeGenerator(folder)
- if options.spec is not None:
- cg.generateCodeFromXML(apiSpecFile)
- elif options.endpoint is not None:
- endpointUrl = 'http://%s:8096/client/api?command=listApis&\
-response=json' % options.endpoint
- cg.generateCodeFromJSON(endpointUrl)
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/configGenerator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/configGenerator.py b/tools/marvin/build/lib/marvin/configGenerator.py
deleted file mode 100644
index a966ae0..0000000
--- a/tools/marvin/build/lib/marvin/configGenerator.py
+++ /dev/null
@@ -1,870 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import json
-import os
-from optparse import OptionParser
-import jsonHelper
-
-
-class managementServer(object):
- def __init__(self):
- self.mgtSvrIp = None
- self.port = 8096
- self.apiKey = None
- self.securityKey = None
-
-
-class dbServer(object):
- def __init__(self):
- self.dbSvr = None
- self.port = 3306
- self.user = "cloud"
- self.passwd = "cloud"
- self.db = "cloud"
-
-
-class configuration(object):
- def __init__(self):
- self.name = None
- self.value = None
-
-
-class logger(object):
- def __init__(self):
- '''TestCase/TestClient'''
- self.name = None
- self.file = None
-
-
-class cloudstackConfiguration(object):
- def __init__(self):
- self.zones = []
- self.mgtSvr = []
- self.dbSvr = None
- self.globalConfig = []
- self.logger = []
-
-
-class zone(object):
- def __init__(self):
- self.dns1 = None
- self.internaldns1 = None
- self.name = None
- '''Basic or Advanced'''
- self.networktype = None
- self.dns2 = None
- self.internaldns2 = None
- self.securitygroupenabled = None
- self.localstorageenabled = None
- '''default public network, in advanced mode'''
- self.ipranges = []
- self.physical_networks = []
- self.pods = []
- self.secondaryStorages = []
- self.cacheStorages = []
-
-
-class traffictype(object):
- def __init__(self, typ, labeldict=None):
- self.typ = typ # Guest/Management/Public
- if labeldict:
- self.xen = labeldict['xen'] if 'xen' in labeldict.keys() else None
- self.kvm = labeldict['kvm'] if 'kvm' in labeldict.keys() else None
- self.vmware = labeldict['vmware']\
- if 'vmware' in labeldict.keys() else None
- self.simulator = labeldict['simulator']\
- if 'simulator' in labeldict.keys() else None
- #{
- # 'xen' : 'cloud-xen',
- # 'kvm' : 'cloud-kvm',
- # 'vmware' : 'cloud-vmware'
- #}
-
-
-class pod(object):
- def __init__(self):
- self.gateway = None
- self.name = None
- self.netmask = None
- self.startip = None
- self.endip = None
- self.zoneid = None
- self.clusters = []
- self.vmwaredc = []
- '''Used in basic network mode'''
- self.guestIpRanges = []
-
-
-class VmwareDc(object):
- def __init__(self):
- self.zoneid = None
- self.name = None
- self.vcenter = None
- self.username = None
- self.password = None
-
-
-class cluster(object):
- def __init__(self):
- self.clustername = None
- self.clustertype = None
- self.hypervisor = None
- self.zoneid = None
- self.podid = None
- self.password = None
- self.url = None
- self.username = None
- self.hosts = []
- self.primaryStorages = []
-
-
-class host(object):
- def __init__(self):
- self.hypervisor = None
- self.password = None
- self.url = None
- self.username = None
- self.zoneid = None
- self.podid = None
- self.clusterid = None
- self.clustername = None
- self.cpunumber = None
- self.cpuspeed = None
- self.hostmac = None
- self.hosttags = None
- self.memory = None
-
-
-class physical_network(object):
- def __init__(self):
- self.name = None
- self.tags = []
- self.traffictypes = []
- self.broadcastdomainrange = 'Zone'
- self.vlan = None
- self.isolationmethods = []
- '''enable default virtual router provider'''
- vrouter = provider()
- vrouter.name = 'VirtualRouter'
- self.providers = [vrouter]
-
-
-class provider(object):
- def __init__(self, name=None):
- self.name = name
- self.state = None
- self.broadcastdomainrange = 'ZONE'
- self.zoneid = None
- self.servicelist = []
- self.devices = []
-
-
-class network(object):
- def __init__(self):
- self.displaytext = None
- self.name = None
- self.zoneid = None
- self.acltype = None
- self.domainid = None
- self.networkdomain = None
- self.networkofferingid = None
- self.ipranges = []
-
-
-class iprange(object):
- def __init__(self):
- '''tagged/untagged'''
- self.gateway = None
- self.netmask = None
- self.startip = None
- self.endip = None
- self.vlan = None
- '''for account specific '''
- self.account = None
- self.domain = None
-
-
-class primaryStorage(object):
- def __init__(self):
- self.name = None
- self.url = None
-
-
-class secondaryStorage(object):
- def __init__(self):
- self.url = None
- self.provider = None
- self.details = None
-
-
-class cacheStorage(object):
- def __init__(self):
- self.url = None
- self.provider = None
- self.details = None
-
-
-class s3(object):
- def __init__(self):
- self.accesskey = None
- self.secretkey = None
- self.bucket = None
- self.endpoint = None
- self.sockettimeout = None
- self.connectiontimeout = None
- self.maxerrorrety = None
- self.usehttps = None
-
-
-class netscaler(object):
- def __init__(self, hostname=None, username='nsroot', password='nsroot'):
- self.hostname = hostname
- self.username = username
- self.password = password
- self.networkdevicetype = 'NetscalerVPXLoadBalancer'
- self.publicinterface = '1/1'
- self.privateinterface = '1/1'
- self.numretries = '2'
- self.lbdevicecapacity = '50'
- self.lbdevicededicated = 'false'
-
- def getUrl(self):
- return repr(self)
-
- def __repr__(self):
- req = zip(self.__dict__.keys(), self.__dict__.values())
- return self.hostname+"?" + "&".join(["=".join([r[0], r[1]])
- for r in req])
-
-
-class srx(object):
- def __init__(self, hostname=None, username='root', password='admin'):
- self.hostname = hostname
- self.username = username
- self.password = password
- self.networkdevicetype = 'JuniperSRXFirewall'
- self.publicinterface = '1/1'
- self.privateinterface = '1/1'
- self.numretries = '2'
- self.fwdevicededicated = 'false'
- self.timeout = '300'
- self.publicnetwork = 'untrusted'
- self.privatenetwork = 'trusted'
-
- def getUrl(self):
- return repr(self)
-
- def __repr__(self):
- req = zip(self.__dict__.keys(), self.__dict__.values())
- return self.hostname+"?" + "&".join(["=".join([r[0], r[1]])
- for r in req])
-
-
-class bigip(object):
- def __init__(self, hostname=None, username='root', password='default'):
- self.hostname = hostname
- self.username = username
- self.password = password
- self.networkdevicetype = 'F5BigIpLoadBalancer'
- self.publicinterface = '1/1'
- self.privateinterface = '1/1'
- self.numretries = '2'
- self.lbdevicededicated = 'false'
- self.lbdevicecapacity = '50'
-
- def getUrl(self):
- return repr(self)
-
- def __repr__(self):
- req = zip(self.__dict__.keys(), self.__dict__.values())
- return self.hostname+"?" + "&".join(["=".join([r[0], r[1]])
- for r in req])
-
-
-def getDeviceUrl(obj):
- req = zip(obj.__dict__.keys(), obj.__dict__.values())
- if obj.hostname:
- return "http://" + obj.hostname+"?" + "&".join(["=".join([r[0],
- r[1]])
- for r in req])
- else:
- return None
-
-
-def describe_setup_in_basic_mode():
- '''sample code to generate setup configuration file'''
- zs = cloudstackConfiguration()
-
- for l in range(1):
- z = zone()
- z.dns1 = "8.8.8.8"
- z.dns2 = "8.8.4.4"
- z.internaldns1 = "192.168.110.254"
- z.internaldns2 = "192.168.110.253"
- z.name = "test"+str(l)
- z.networktype = 'Basic'
- z.securitygroupenabled = 'True'
-
- #If security groups are reqd
- sgprovider = provider()
- sgprovider.broadcastdomainrange = 'Pod'
- sgprovider.name = 'SecurityGroupProvider'
-
- pn = physical_network()
- pn.name = "test-network"
- pn.traffictypes = [traffictype("Guest"), traffictype("Management")]
- pn.providers.append(sgprovider)
-
- z.physical_networks.append(pn)
-
- '''create 10 pods'''
- for i in range(2):
- p = pod()
- p.name = "test" + str(l) + str(i)
- p.gateway = "192.168.%d.1" % i
- p.netmask = "255.255.255.0"
- p.startip = "192.168.%d.150" % i
- p.endip = "192.168.%d.220" % i
-
- '''add two pod guest ip ranges'''
- for j in range(2):
- ip = iprange()
- ip.gateway = p.gateway
- ip.netmask = p.netmask
- ip.startip = "192.168.%d.%d" % (i, j*20)
- ip.endip = "192.168.%d.%d" % (i, j*20+10)
-
- p.guestIpRanges.append(ip)
-
- '''add 10 clusters'''
- for j in range(2):
- c = cluster()
- c.clustername = "test"+str(l)+str(i) + str(j)
- c.clustertype = "CloudManaged"
- c.hypervisor = "Simulator"
-
- '''add 10 hosts'''
- for k in range(2):
- h = host()
- h.username = "root"
- h.password = "password"
- memory = 8*1024*1024*1024
- localstorage = 1*1024*1024*1024*1024
- h.url = "http://sim/%d%d%d%d" % (l, i, j, k)
- c.hosts.append(h)
-
- '''add 2 primary storages'''
- for m in range(2):
- primary = primaryStorage()
- primary.name = "primary"+str(l) + str(i) + str(j) + str(m)
- primary.url = "nfs://localhost/path%s" % (str(l) + str(i) +
- str(j) + str(m))
- c.primaryStorages.append(primary)
-
- p.clusters.append(c)
-
- z.pods.append(p)
-
- '''add two secondary'''
- for i in range(5):
- secondary = secondaryStorage()
- secondary.url = "nfs://localhost/path"+str(l) + str(i)
- z.secondaryStorages.append(secondary)
-
- zs.zones.append(z)
-
- '''Add one mgt server'''
- mgt = managementServer()
- mgt.mgtSvrIp = "localhost"
- zs.mgtSvr.append(mgt)
-
- '''Add a database'''
- db = dbServer()
- db.dbSvr = "localhost"
-
- zs.dbSvr = db
-
- '''add global configuration'''
- global_settings = {'expunge.delay': '60',
- 'expunge.interval': '60',
- 'expunge.workers': '3',
- }
- for k, v in global_settings.iteritems():
- cfg = configuration()
- cfg.name = k
- cfg.value = v
- zs.globalConfig.append(cfg)
-
- ''''add loggers'''
- testClientLogger = logger()
- testClientLogger.name = "TestClient"
- testClientLogger.file = "/tmp/testclient.log"
-
- testCaseLogger = logger()
- testCaseLogger.name = "TestCase"
- testCaseLogger.file = "/tmp/testcase.log"
-
- zs.logger.append(testClientLogger)
- zs.logger.append(testCaseLogger)
-
- return zs
-
-
-def describe_setup_in_eip_mode():
- """
- Setting up an EIP/ELB enabled zone with netscaler provider
- """
- zs = cloudstackConfiguration()
-
- for l in range(1):
- z = zone()
- z.dns1 = "8.8.8.8"
- z.dns2 = "8.8.4.4"
- z.internaldns1 = "192.168.110.254"
- z.internaldns2 = "192.168.110.253"
- z.name = "test"+str(l)
- z.networktype = 'Basic'
-
- ips = iprange()
- ips.vlan = "49"
- ips.startip = "10.147.49.200"
- ips.endip = "10.147.49.250"
- ips.gateway = "10.147.49.1"
- ips.netmask = "255.255.255.0"
- z.ipranges.append(ips)
-
- #If security groups are reqd
- sgprovider = provider()
- sgprovider.broadcastdomainrange = 'Pod'
- sgprovider.name = 'SecurityGroupProvider'
-
- nsprovider = provider()
- nsprovider.name = 'Netscaler'
- ns = netscaler()
- ns.hostname = '10.147.40.100'
- nsprovider.devices.append(ns)
-
- pn = physical_network()
- pn.name = "test-network"
- pn.traffictypes = [traffictype("Guest",
- {"xen": "cloud-guest"}),
- traffictype("Management"),
- traffictype("Public", {"xen": "cloud-public"})]
- pn.providers.extend([sgprovider, nsprovider])
- z.physical_networks.append(pn)
-
- '''create 10 pods'''
- for i in range(2):
- p = pod()
- p.name = "test" + str(l) + str(i)
- p.gateway = "192.168.%d.1" % i
- p.netmask = "255.255.255.0"
- p.startip = "192.168.%d.150" % i
- p.endip = "192.168.%d.220" % i
-
- '''add two pod guest ip ranges'''
- for j in range(2):
- ip = iprange()
- ip.gateway = p.gateway
- ip.netmask = p.netmask
- ip.startip = "192.168.%d.%d" % (i, j*20)
- ip.endip = "192.168.%d.%d" % (i, j*20+10)
-
- p.guestIpRanges.append(ip)
-
- '''add 10 clusters'''
- for j in range(2):
- c = cluster()
- c.clustername = "test"+str(l)+str(i) + str(j)
- c.clustertype = "CloudManaged"
- c.hypervisor = "Simulator"
-
- '''add 10 hosts'''
- for k in range(2):
- h = host()
- h.username = "root"
- h.password = "password"
- h.url = "http://Sim/%d%d%d%d" % (l, i, j, k)
- c.hosts.append(h)
-
- '''add 2 primary storages'''
- for m in range(2):
- primary = primaryStorage()
- primary.name = "primary"+str(l) + str(i) + str(j) + str(m)
- primary.url = "nfs://localhost/path%s" % (str(l) + str(i)
- + str(j)
- + str(m))
- c.primaryStorages.append(primary)
-
- p.clusters.append(c)
-
- z.pods.append(p)
-
- '''add two secondary'''
- for i in range(5):
- secondary = secondaryStorage()
- secondary.url = "nfs://localhost/path"+str(l) + str(i)
- z.secondaryStorages.append(secondary)
-
- zs.zones.append(z)
-
- '''Add one mgt server'''
- mgt = managementServer()
- mgt.mgtSvrIp = "localhost"
- zs.mgtSvr.append(mgt)
-
- '''Add a database'''
- db = dbServer()
- db.dbSvr = "localhost"
-
- zs.dbSvr = db
-
- '''add global configuration'''
- global_settings = {'expunge.delay': '60',
- 'expunge.interval': '60',
- 'expunge.workers': '3',
- }
- for k, v in global_settings.iteritems():
- cfg = configuration()
- cfg.name = k
- cfg.value = v
- zs.globalConfig.append(cfg)
-
- ''''add loggers'''
- testClientLogger = logger()
- testClientLogger.name = "TestClient"
- testClientLogger.file = "/tmp/testclient.log"
-
- testCaseLogger = logger()
- testCaseLogger.name = "TestCase"
- testCaseLogger.file = "/tmp/testcase.log"
-
- zs.logger.append(testClientLogger)
- zs.logger.append(testCaseLogger)
-
- return zs
-
-
-def describe_setup_in_advanced_mode():
- '''sample code to generate setup configuration file'''
- zs = cloudstackConfiguration()
-
- for l in range(1):
- z = zone()
- z.dns1 = "8.8.8.8"
- z.dns2 = "8.8.4.4"
- z.internaldns1 = "192.168.110.254"
- z.internaldns2 = "192.168.110.253"
- z.name = "test"+str(l)
- z.networktype = 'Advanced'
- z.guestcidraddress = "10.1.1.0/24"
- z.vlan = "100-2000"
-
- pn = physical_network()
- pn.name = "test-network"
- pn.traffictypes = [traffictype("Guest"), traffictype("Management"),
- traffictype("Public")]
-
- vpcprovider = provider('VpcVirtualRouter')
-
- nsprovider = provider('Netscaler')
- nsprovider.devices.append(netscaler(hostname='10.147.40.100'))
-
- srxprovider = provider('JuniperSRX')
- srxprovider.devices.append(srx(hostname='10.147.40.3'))
-
- f5provider = provider('F5BigIp')
- f5provider.devices.append(bigip(hostname='10.147.40.3'))
-
- pn.providers.extend([vpcprovider, nsprovider, srxprovider, f5provider])
- z.physical_networks.append(pn)
-
- '''create 10 pods'''
- for i in range(2):
- p = pod()
- p.name = "test" + str(l) + str(i)
- p.gateway = "192.168.%d.1" % i
- p.netmask = "255.255.255.0"
- p.startip = "192.168.%d.200" % i
- p.endip = "192.168.%d.220" % i
-
- '''add 10 clusters'''
- for j in range(2):
- c = cluster()
- c.clustername = "test"+str(l)+str(i) + str(j)
- c.clustertype = "CloudManaged"
- c.hypervisor = "Simulator"
-
- '''add 10 hosts'''
- for k in range(2):
- h = host()
- h.username = "root"
- h.password = "password"
- memory = 8 * 1024 * 1024 * 1024
- localstorage = 1 * 1024 * 1024 * 1024 * 1024
- #h.url = "http://sim/%d%d%d%d/cpucore=1&cpuspeed=8000&\
- # memory=%d&localstorage=%d"%(l, i, j, k, memory,
- # localstorage)
- h.url = "http://sim/%d%d%d%d" % (l, i, j, k)
- c.hosts.append(h)
-
- '''add 2 primary storages'''
- for m in range(2):
- primary = primaryStorage()
- primary.name = "primary"+str(l) + str(i) + str(j) + str(m)
- #primary.url = "nfs://localhost/path%s/size=%d" %
- # (str(l) + str(i) + str(j) + str(m), size)
- primary.url = "nfs://localhost/path%s" % (str(l) + str(i)
- + str(j)
- + str(m))
- c.primaryStorages.append(primary)
-
- p.clusters.append(c)
-
- z.pods.append(p)
-
- '''add two secondary'''
- for i in range(5):
- secondary = secondaryStorage()
- secondary.url = "nfs://localhost/path"+str(l) + str(i)
- z.secondaryStorages.append(secondary)
-
- '''add default public network'''
- ips = iprange()
- ips.vlan = "26"
- ips.startip = "172.16.26.2"
- ips.endip = "172.16.26.100"
- ips.gateway = "172.16.26.1"
- ips.netmask = "255.255.255.0"
- z.ipranges.append(ips)
-
- zs.zones.append(z)
-
- '''Add one mgt server'''
- mgt = managementServer()
- mgt.mgtSvrIp = "localhost"
- zs.mgtSvr.append(mgt)
-
- '''Add a database'''
- db = dbServer()
- db.dbSvr = "localhost"
-
- zs.dbSvr = db
-
- '''add global configuration'''
- global_settings = {'expunge.delay': '60',
- 'expunge.interval': '60',
- 'expunge.workers': '3',
- }
- for k, v in global_settings.iteritems():
- cfg = configuration()
- cfg.name = k
- cfg.value = v
- zs.globalConfig.append(cfg)
-
- ''''add loggers'''
- testClientLogger = logger()
- testClientLogger.name = "TestClient"
- testClientLogger.file = "/tmp/testclient.log"
-
- testCaseLogger = logger()
- testCaseLogger.name = "TestCase"
- testCaseLogger.file = "/tmp/testcase.log"
-
- zs.logger.append(testClientLogger)
- zs.logger.append(testCaseLogger)
-
- return zs
-
-'''sample code to generate setup configuration file'''
-
-
-def describe_setup_in_advancedsg_mode():
- zs = cloudstackConfiguration()
-
- for l in range(1):
- z = zone()
- z.dns1 = "8.8.8.8"
- z.dns2 = "8.8.4.4"
- z.internaldns1 = "192.168.110.254"
- z.internaldns2 = "192.168.110.253"
- z.name = "test"+str(l)
- z.networktype = 'Advanced'
- z.vlan = "100-2000"
- z.securitygroupenabled = "true"
-
- pn = physical_network()
- pn.name = "test-network"
- pn.traffictypes = [traffictype("Guest"), traffictype("Management")]
-
- #If security groups are reqd
- sgprovider = provider()
- sgprovider.broadcastdomainrange = 'ZONE'
- sgprovider.name = 'SecurityGroupProvider'
-
- pn.providers.append(sgprovider)
- z.physical_networks.append(pn)
-
- '''create 10 pods'''
- for i in range(2):
- p = pod()
- p.name = "test" + str(l) + str(i)
- p.gateway = "192.168.%d.1" % i
- p.netmask = "255.255.255.0"
- p.startip = "192.168.%d.200" % i
- p.endip = "192.168.%d.220" % i
-
- '''add 10 clusters'''
- for j in range(2):
- c = cluster()
- c.clustername = "test"+str(l)+str(i) + str(j)
- c.clustertype = "CloudManaged"
- c.hypervisor = "Simulator"
-
- '''add 10 hosts'''
- for k in range(2):
- h = host()
- h.username = "root"
- h.password = "password"
- memory = 8 * 1024 * 1024 * 1024
- localstorage = 1 * 1024 * 1024 * 1024 * 1024
- #h.url = "http://sim/%d%d%d%d/cpucore=1&cpuspeed=8000&\
- #memory=%d&localstorage=%d" % (l, i, j, k, memory,
- #localstorage)
- h.url = "http://sim/%d%d%d%d" % (l, i, j, k)
- c.hosts.append(h)
-
- '''add 2 primary storages'''
- for m in range(2):
- primary = primaryStorage()
- primary.name = "primary"+str(l) + str(i) + str(j) + str(m)
- #primary.url = "nfs://localhost/path%s/size=%d" % \
- #(str(l) + str(i) + str(j) + str(m), size)
- primary.url = "nfs://localhost/path%s" % \
- (str(l) + str(i) + str(j) + str(m))
- c.primaryStorages.append(primary)
-
- p.clusters.append(c)
-
- z.pods.append(p)
-
- '''add two secondary'''
- for i in range(5):
- secondary = secondaryStorage()
- secondary.url = "nfs://localhost/path"+str(l) + str(i)
- z.secondaryStorages.append(secondary)
-
- '''add default guest network'''
- ips = iprange()
- ips.vlan = "26"
- ips.startip = "172.16.26.2"
- ips.endip = "172.16.26.100"
- ips.gateway = "172.16.26.1"
- ips.netmask = "255.255.255.0"
- z.ipranges.append(ips)
-
- zs.zones.append(z)
-
- '''Add one mgt server'''
- mgt = managementServer()
- mgt.mgtSvrIp = "localhost"
- zs.mgtSvr.append(mgt)
-
- '''Add a database'''
- db = dbServer()
- db.dbSvr = "localhost"
-
- zs.dbSvr = db
-
- '''add global configuration'''
- global_settings = {'expunge.delay': '60',
- 'expunge.interval': '60',
- 'expunge.workers': '3',
- }
- for k, v in global_settings.iteritems():
- cfg = configuration()
- cfg.name = k
- cfg.value = v
- zs.globalConfig.append(cfg)
-
- ''''add loggers'''
- testClientLogger = logger()
- testClientLogger.name = "TestClient"
- testClientLogger.file = "/tmp/testclient.log"
-
- testCaseLogger = logger()
- testCaseLogger.name = "TestCase"
- testCaseLogger.file = "/tmp/testcase.log"
-
- zs.logger.append(testClientLogger)
- zs.logger.append(testCaseLogger)
-
- return zs
-
-
-def generate_setup_config(config, file=None):
- describe = config
- if file is None:
- return json.dumps(jsonHelper.jsonDump.dump(describe))
- else:
- fp = open(file, 'w')
- json.dump(jsonHelper.jsonDump.dump(describe), fp, indent=4)
- fp.close()
-
-
-def get_setup_config(file):
- if not os.path.exists(file):
- raise IOError("config file %s not found. \
-please specify a valid config file" % file)
- config = cloudstackConfiguration()
- configLines = []
- with open(file, 'r') as fp:
- for line in fp:
- ws = line.strip()
- if not ws.startswith("#"):
- configLines.append(ws)
- config = json.loads("\n".join(configLines))
- return jsonHelper.jsonLoader(config)
-
-if __name__ == "__main__":
- parser = OptionParser()
-
- parser.add_option("-i", "--input", action="store", default=None,
- dest="inputfile", help="input file")
- parser.add_option("-a", "--advanced", action="store_true", default=False,
- dest="advanced", help="use advanced networking")
- parser.add_option("-s", "--advancedsg", action="store_true", default=False,
- dest="advancedsg", help="use advanced networking \
-with security groups")
- parser.add_option("-o", "--output", action="store",
- default="./datacenterCfg", dest="output",
- help="the path where the json config file generated, \
-by default is ./datacenterCfg")
-
- (options, args) = parser.parse_args()
-
- if options.inputfile:
- config = get_setup_config(options.inputfile)
- if options.advanced:
- config = describe_setup_in_advanced_mode()
- elif options.advancedsg:
- config = describe_setup_in_advancedsg_mode()
- else:
- config = describe_setup_in_basic_mode()
-
- generate_setup_config(config, options.output)
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65b12f45/tools/marvin/build/lib/marvin/dbConnection.py
----------------------------------------------------------------------
diff --git a/tools/marvin/build/lib/marvin/dbConnection.py b/tools/marvin/build/lib/marvin/dbConnection.py
deleted file mode 100644
index 99014ab..0000000
--- a/tools/marvin/build/lib/marvin/dbConnection.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import mysql
-import contextlib
-from mysql import connector
-from mysql.connector import errors
-from contextlib import closing
-import cloudstackException
-import sys
-import os
-
-
-class dbConnection(object):
- def __init__(self, host="localhost", port=3306, user='cloud',
- passwd='cloud', db='cloud'):
- self.host = host
- self.port = port
- self.user = str(user) # Workaround: http://bugs.mysql.com/?id=67306
- self.passwd = passwd
- self.database = db
-
- def execute(self, sql=None, params=None):
- if sql is None:
- return None
-
- resultRow = []
- with contextlib.\
- closing(mysql.connector.connect(host=str(self.host),
- port=int(self.port),
- user=str(self.user),
- password=str(self.passwd),
- db=str(self.database))) as conn:
- conn.autocommit = True
- with contextlib.closing(conn.cursor(buffered=True)) as cursor:
- cursor.execute(sql, params)
- try:
- resultRow = cursor.fetchall()
- except errors.InterfaceError:
- #Raised on empty result - DML
- resultRow = []
- return resultRow
-
- def executeSqlFromFile(self, fileName=None):
- if fileName is None:
- raise cloudstackException.\
- InvalidParameterException("file can't not none")
-
- if not os.path.exists(fileName):
- raise cloudstackException.\
- InvalidParameterException("%s not exists" % fileName)
-
- sqls = open(fileName, "r").read()
- return self.execute(sqls)
-
-if __name__ == "__main__":
- db = dbConnection()
- '''
- try:
-
- result = db.executeSqlFromFile("/tmp/server-setup.sql")
- if result is not None:
- for r in result:
- print r[0], r[1]
- except cloudstackException.dbException, e:
- print e
- '''
- print db.execute("update vm_template set name='fjkd' where id=200")
- for i in range(10):
- result = db.execute("select job_status, created, \
-last_updated from async_job where id=%d" % i)
- print result