From c16f13841f3c230a318aa2f7e852d553642cfaf3 Mon Sep 17 00:00:00 2001 From: Ewan Mellor Date: Mon, 13 Feb 2012 14:02:11 -0800 Subject: [PATCH 01/14] Added build-apidocs-zip build target that generates HTML versions of the API docs. Uses XML/XSLT generation system originally by Abhinandan Prateek (I think). CSS updates from Jessica Tomechak. gen_toc.py and build script changes by me. Conflicts: build/developer.xml --- build/developer.xml | 8 +- setup/apidoc/XmlToHtmlConverter.java | 142 +++ setup/apidoc/build-apidoc.sh | 33 +- setup/apidoc/gen_toc.py | 245 ++++ setup/apidoc/generateadmincommands.xsl | 150 +++ setup/apidoc/generatecommand.xsl | 186 +++ setup/apidoc/generatecustomcommand.xsl | 47 + setup/apidoc/generatedomainadmincommands.xsl | 152 +++ setup/apidoc/generategenericcommand.xsl | 39 + setup/apidoc/generatetoc.xsl | 1128 +++++++++++++++++ setup/apidoc/generatetoc_footer.xsl | 32 + setup/apidoc/generatetoc_header.xsl | 52 + setup/apidoc/generateusercommands.xsl | 150 +++ setup/apidoc/images/api_bullets.gif | Bin 0 -> 45 bytes setup/apidoc/images/back_button.gif | Bin 0 -> 870 bytes setup/apidoc/images/back_button_hover.gif | Bin 0 -> 868 bytes setup/apidoc/images/cloudstack.png | Bin 0 -> 3893 bytes setup/apidoc/images/ins_buttonshadow.gif | Bin 0 -> 1683 bytes setup/apidoc/images/insdownload_button.gif | Bin 0 -> 2531 bytes .../images/insdownload_button_hover.gif | Bin 0 -> 2569 bytes setup/apidoc/images/insjoincomm_button.gif | Bin 0 -> 2627 bytes .../images/insjoincomm_button_hover.gif | Bin 0 -> 2620 bytes setup/apidoc/includes/main.css | 1073 ++++++++++++++++ 23 files changed, 3434 insertions(+), 3 deletions(-) create mode 100644 setup/apidoc/XmlToHtmlConverter.java create mode 100644 setup/apidoc/gen_toc.py create mode 100644 setup/apidoc/generateadmincommands.xsl create mode 100644 setup/apidoc/generatecommand.xsl create mode 100644 setup/apidoc/generatecustomcommand.xsl create mode 100644 setup/apidoc/generatedomainadmincommands.xsl create mode 100644 setup/apidoc/generategenericcommand.xsl create mode 100644 setup/apidoc/generatetoc.xsl create mode 100644 setup/apidoc/generatetoc_footer.xsl create mode 100644 setup/apidoc/generatetoc_header.xsl create mode 100644 setup/apidoc/generateusercommands.xsl create mode 100644 setup/apidoc/images/api_bullets.gif create mode 100644 setup/apidoc/images/back_button.gif create mode 100644 setup/apidoc/images/back_button_hover.gif create mode 100644 setup/apidoc/images/cloudstack.png create mode 100644 setup/apidoc/images/ins_buttonshadow.gif create mode 100644 setup/apidoc/images/insdownload_button.gif create mode 100644 setup/apidoc/images/insdownload_button_hover.gif create mode 100644 setup/apidoc/images/insjoincomm_button.gif create mode 100644 setup/apidoc/images/insjoincomm_button_hover.gif create mode 100644 setup/apidoc/includes/main.css diff --git a/build/developer.xml b/build/developer.xml index 6e516d23db2..2412edbec6e 100755 --- a/build/developer.xml +++ b/build/developer.xml @@ -384,8 +384,8 @@ + - @@ -396,5 +396,9 @@ - + + + + + diff --git a/setup/apidoc/XmlToHtmlConverter.java b/setup/apidoc/XmlToHtmlConverter.java new file mode 100644 index 00000000000..455bd62352b --- /dev/null +++ b/setup/apidoc/XmlToHtmlConverter.java @@ -0,0 +1,142 @@ +// jdk1.4.1 +import javax.xml.transform.*; +import java.io.*; + +public class XmlToHtmlConverter extends XmlToHtmlConverterData { + + // To turn off generation of API docs for certain roles, comment out + // the appropriate populateFor*() line(s) below. + public static void main(String[] args) { + + XmlToHtmlConverter x = new XmlToHtmlConverter(); + x.populateForRootAdmin(); + x.populateForDomainAdmin(); + x.populateForUser(); + x.generateToc(); + x.generateIndividualCommandPages(); + } + + public void generateToc() { + try { + + TransformerFactory tFactory = TransformerFactory.newInstance(); + + // Generate the TOC for the API reference for User role + Transformer transformer = + tFactory.newTransformer + (new javax.xml.transform.stream.StreamSource + ("generatetocforuser.xsl")); + + // The XML to be transformed must be at the location below. + // Modify this path to match your own setup. + transformer.transform + (new javax.xml.transform.stream.StreamSource + ("regular_user/regularUserSummary.xml"), + // Modify this path to your own desired output location. + new javax.xml.transform.stream.StreamResult + ( new FileOutputStream("html/TOC_User.html"))); + + // Generate the TOC for root administrator role + Transformer transformer1 = + tFactory.newTransformer + (new javax.xml.transform.stream.StreamSource + ("generatetocforadmin.xsl")); + + // The XML to be transformed must be at the location below. + // Modify this path to match your own setup. + transformer1.transform + (new javax.xml.transform.stream.StreamSource + ("root_admin/rootAdminSummary.xml"), + // Modify this path to your own desired output location. + new javax.xml.transform.stream.StreamResult + ( new FileOutputStream("html/TOC_Root_Admin.html"))); + + // Generate the TOC for domain admin role + Transformer transformer2 = + tFactory.newTransformer + (new javax.xml.transform.stream.StreamSource + ("generatetocfordomainadmin.xsl")); + + // The XML to be transformed must be at the location below. + // Modify this path to match your own setup. + transformer2.transform + (new javax.xml.transform.stream.StreamSource + ("domain_admin/domainAdminSummary.xml"), + // Modify this path to your own desired output location. + new javax.xml.transform.stream.StreamResult + ( new FileOutputStream("html/TOC_Domain_Admin.html"))); + + } + catch (Exception e) { + e.printStackTrace( ); + } + } + + // Create man pages + public void generateIndividualCommandPages() { + for(String commandName : rootAdminCommandNames) { + + try { + + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer transformer = + tFactory.newTransformer + (new javax.xml.transform.stream.StreamSource + ("generateadmincommands.xsl")); + + transformer.transform + // Modify this path to the location of the input files on your system. + (new javax.xml.transform.stream.StreamSource + ("root_admin/"+commandName+".xml"), + // Modify this path with the desired output location. + new javax.xml.transform.stream.StreamResult + ( new FileOutputStream("html/root_admin/"+commandName+".html"))); + } catch (Exception e) { + e.printStackTrace( ); + } + } + + for(String commandName : domainAdminCommandNames) { + + try { + + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer transformer = + tFactory.newTransformer + (new javax.xml.transform.stream.StreamSource + ("generatedomainadmincommands.xsl")); + + transformer.transform + // Modify this path with the location of the input files on your system. + (new javax.xml.transform.stream.StreamSource + ("domain_admin/"+commandName+".xml"), + // Modify this path to the desired output location. + new javax.xml.transform.stream.StreamResult + ( new FileOutputStream("html/domain_admin/"+commandName+".html"))); + } catch (Exception e) { + e.printStackTrace( ); + } + } + + for(String commandName : userCommandNames) { + + try { + + TransformerFactory tFactory = TransformerFactory.newInstance(); + + Transformer transformer = + tFactory.newTransformer + (new javax.xml.transform.stream.StreamSource + ("generateusercommands.xsl")); + + transformer.transform + (new javax.xml.transform.stream.StreamSource + ("regular_user/"+commandName+".xml"), + new javax.xml.transform.stream.StreamResult + ( new FileOutputStream("html/user/"+commandName+".html"))); + } catch (Exception e) { + e.printStackTrace( ); + } + } + } +} diff --git a/setup/apidoc/build-apidoc.sh b/setup/apidoc/build-apidoc.sh index e8c61e2742e..52af2d281f3 100644 --- a/setup/apidoc/build-apidoc.sh +++ b/setup/apidoc/build-apidoc.sh @@ -24,6 +24,11 @@ TARGETJARDIR="$1" shift DEPSDIR="$1" shift +DISTDIR="$1" +shift + +thisdir=$(readlink -f $(dirname "$0")) + PATHSEP=':' if [[ $OSTYPE == "cygwin" ]] ; then @@ -41,9 +46,35 @@ for file in $DEPSDIR/*.jar; do CP=${CP}$PATHSEP$file done -java -cp $CP com.cloud.api.doc.ApiXmlDocWriter $* +java -cp $CP com.cloud.api.doc.ApiXmlDocWriter -d "$DISTDIR" $* if [ $? -ne 0 ] then exit 1 fi + +set -e +(cd "$DISTDIR/xmldoc" + cp "$thisdir"/*.java . + cp "$thisdir"/*.xsl . + sed -e 's,%API_HEADER%,User API,g' "$thisdir/generatetoc_header.xsl" >generatetocforuser.xsl + sed -e 's,%API_HEADER%,Root Admin API,g' "$thisdir/generatetoc_header.xsl" >generatetocforadmin.xsl + sed -e 's,%API_HEADER%,Domain Admin API,g' "$thisdir/generatetoc_header.xsl" >generatetocfordomainadmin.xsl + + python "$thisdir/gen_toc.py" $(find -type f) + + cat generatetocforuser_include.xsl >>generatetocforuser.xsl + cat generatetocforadmin_include.xsl >>generatetocforadmin.xsl + cat generatetocfordomainadmin_include.xsl >>generatetocfordomainadmin.xsl + + cat "$thisdir/generatetoc_footer.xsl" >>generatetocforuser.xsl + cat "$thisdir/generatetoc_footer.xsl" >>generatetocforadmin.xsl + cat "$thisdir/generatetoc_footer.xsl" >>generatetocfordomainadmin.xsl + + mkdir -p html/user html/domain_admin html/root_admin + cp -r "$thisdir/includes" html + cp -r "$thisdir/images" html + + javac -cp . *.java + java -cp . XmlToHtmlConverter +) diff --git a/setup/apidoc/gen_toc.py b/setup/apidoc/gen_toc.py new file mode 100644 index 00000000000..a4d5c958e1d --- /dev/null +++ b/setup/apidoc/gen_toc.py @@ -0,0 +1,245 @@ +#!/usr/bin/python + +import os +import os.path +import sys +from xml.dom import minidom +from xml.parsers.expat import ExpatError + + +REGULAR_USER = 'u' +DOMAIN_ADMIN = 'd' +ROOT_ADMIN = 'r' + +user_to_func = { + REGULAR_USER: 'populateForUser', + DOMAIN_ADMIN: 'populateForDomainAdmin', + ROOT_ADMIN: 'populateForRootAdmin', + } + + +user_to_cns = { + REGULAR_USER: 'userCommandNames', + DOMAIN_ADMIN: 'domainAdminCommandNames', + ROOT_ADMIN: 'rootAdminCommandNames', + } + + +dirname_to_user = { + 'regular_user': REGULAR_USER, + 'domain_admin': DOMAIN_ADMIN, + 'root_admin': ROOT_ADMIN, + } + + +dirname_to_dirname = { + 'regular_user': 'user', + 'domain_admin': 'domain_admin', + 'root_admin': 'root_admin', + } + + +known_categories = { + 'SystemVm': 'System VM', + 'VirtualMachine': 'Virtual Machine', + 'VM': 'Virtual Machine', + 'Domain': 'Domain', + 'Template': 'Template', + 'Iso': 'ISO', + 'Volume': 'Volume', + 'Vlan': 'VLAN', + 'IpAddress': 'Address', + 'PortForwarding': 'Firewall', + 'Firewall': 'Firewall', + 'StaticNat': 'NAT', + 'IpForwarding': 'NAT', + 'Host': 'Host', + 'Cluster': 'Cluster', + 'Account': 'Account', + 'Snapshot': 'Snapshot', + 'User': 'User', + 'Os': 'Guest OS', + 'ServiceOffering': 'Service Offering', + 'DiskOffering': 'Disk Offering', + 'LoadBalancer': 'Load Balancer', + 'Router': 'Router', + 'SystemVm': 'System VM', + 'Configuration': 'Configuration', + 'Capabilities': 'Configuration', + 'Pod': 'Pod', + 'Zone': 'Zone', + 'NetworkOffering': 'Network Offering', + 'Network': 'Network', + 'Vpn': 'VPN', + 'Limit': 'Limit', + 'ResourceCount': 'Limit', + 'CloudIdentifier': 'Cloud Identifier', + 'InstanceGroup': 'VM Group', + 'StorageMaintenance': 'Storage Pool', + 'StoragePool': 'Storage Pool', + 'SecurityGroup': 'Security Group', + 'SSH': 'SSH', + 'register': 'Registration', + 'AsyncJob': 'Async job', + 'Certificate': 'Certificate', + 'Hypervisor': 'Hypervisor', + 'Alert': 'Alert', + 'Event': 'Event', + 'login': 'Login', + 'logout': 'Logout', + 'Capacity': 'System Capacity', + 'NetworkDevice': 'Network Device', + 'ExternalLoadBalancer': 'Ext Load Balancer', + 'ExternalFirewall': 'Ext Firewall', + 'Usage': 'Usage', + 'TrafficMonitor': 'Usage', + 'TrafficType': 'Usage', + 'Product': 'Product', + 'LB': 'Load Balancer', + 'ldap': 'LDAP', + 'Swift': 'Swift', + 'SecondaryStorage': 'Host', + 'Project': 'Project', + 'Lun': 'Storage', + 'Pool': 'Pool', + } + + +categories = {} + + +def choose_category(fn): + for k, v in known_categories.iteritems(): + if k in fn: + return v + raise Exception(fn) + + +for f in sys.argv: + dirname, fn = os.path.split(f) + if not fn.endswith('.xml'): + continue + if fn.endswith('Summary.xml'): + continue + if fn.endswith('SummarySorted.xml'): + continue + if fn == 'alert_types.xml': + continue + if dirname.startswith('./'): + dirname = dirname[2:] + try: + dom = minidom.parse(file(f)) + name = dom.getElementsByTagName('name')[0].firstChild.data + isAsync = dom.getElementsByTagName('isAsync')[0].firstChild.data + category = choose_category(fn) + if category not in categories: + categories[category] = [] + categories[category].append({ + 'name': name, + 'dirname': dirname_to_dirname[dirname], + 'async': isAsync == 'true', + 'user': dirname_to_user[dirname], + }) + except ExpatError, e: + pass + except IndexError, e: + print fn + + +def xml_for(command): + name = command['name'] + async = command['async'] and ' (A)' or '' + dirname = command['dirname'] + return ''' +
  • %(async)s
  • +
    +''' % locals() + + +def write_xml(out, user): + with file(out, 'w') as f: + cat_strings = [] + + for category in categories.keys(): + strings = [] + for command in categories[category]: + if command['user'] == user: + strings.append(xml_for(command)) + if strings: + all_strings = ''.join(strings) + cat_strings.append((len(strings), category, all_strings)) + + cat_strings.sort(reverse=True) + + i = 0 + for _1, category, all_strings in cat_strings: + if i == 0: + print >>f, '
    ' + print >>f, '''
    +
    %(category)s
    +
      + +%(all_strings)s + +
    +
    + +''' % locals() + if i == 3: + print >>f, '
    ' + i = 0 + else: + i += 1 + if i != 0: + print >>f, '' + + +def java_for(command, user): + name = command['name'] + cns = user_to_cns[user] + return '''%(cns)s.add("%(name)s"); +''' % locals() + + +def java_for_user(user): + strings = [] + for category in categories.keys(): + for command in categories[category]: + if command['user'] == user: + strings.append(java_for(command, user)) + func = user_to_func[user] + all_strings = ''.join(strings) + return ''' + public void %(func)s() { + %(all_strings)s + } +''' % locals() + + +def write_java(out): + with file(out, 'w') as f: + print >>f, '''/* Generated using gen_toc.py. Do not edit. */ + +import java.util.HashSet; +import java.util.Set; + +public class XmlToHtmlConverterData { + + Set rootAdminCommandNames = new HashSet(); + Set domainAdminCommandNames = new HashSet(); + Set userCommandNames = new HashSet(); + +''' + print >>f, java_for_user(REGULAR_USER) + print >>f, java_for_user(ROOT_ADMIN) + print >>f, java_for_user(DOMAIN_ADMIN) + + print >>f, ''' +} +''' + + +write_xml('generatetocforuser_include.xsl', REGULAR_USER) +write_xml('generatetocforadmin_include.xsl', ROOT_ADMIN) +write_xml('generatetocfordomainadmin_include.xsl', DOMAIN_ADMIN) +write_java('XmlToHtmlConverterData.java') diff --git a/setup/apidoc/generateadmincommands.xsl b/setup/apidoc/generateadmincommands.xsl new file mode 100644 index 00000000000..7b566db123a --- /dev/null +++ b/setup/apidoc/generateadmincommands.xsl @@ -0,0 +1,150 @@ + + + + + + + + + +CloudStack | The Power Behind Your Cloud + + + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + CloudStack v2.2.13 - 2.2.14 Root Admin API Reference + +

    +

    +

    +
    +
    + + +
    + +
    +
    +
    +

    Request parameters

    + + + + + + + + + + + + + + + + + + + + + +
    Parameter NameDescriptionRequired
    +
    + + +
    +

    Response Tags

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Response NameDescription
    + +
    + + +
    +
    + + +
    +
    + + + + + +
    +
    +
    + + +
    +
    + diff --git a/setup/apidoc/generatecommand.xsl b/setup/apidoc/generatecommand.xsl new file mode 100644 index 00000000000..5914e7db253 --- /dev/null +++ b/setup/apidoc/generatecommand.xsl @@ -0,0 +1,186 @@ + + + + + + + + + +CloudStack | The Power Behind Your Cloud + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    +
    +

    +
    + +
    +
    + + +
    +
    +
    +
    + +
    + +
    + +
    +
    +
    +
    + +

    + +
    +
    + + +
    + +
    +
    +
    +

    Request parameters

    + + + + + + + + + + + + + + + +
    Parameter NameDescriptionRequired
    +
    + + +
    +

    Response Tags

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Response NameDescription
    + +
    + + +
    +
    + + +
    +
    + + + + + +
    +
    +
    + + +
    +
    + diff --git a/setup/apidoc/generatecustomcommand.xsl b/setup/apidoc/generatecustomcommand.xsl new file mode 100644 index 00000000000..16c6c64e87f --- /dev/null +++ b/setup/apidoc/generatecustomcommand.xsl @@ -0,0 +1,47 @@ + + + + +Cloudstack API + + + + + + + + + + + + + + + + +
    NameDescriptionRequest ParametersResponse Parameters
    + +
    Name:
    +Description: +
    Required:
    +
    +
    + +
    Name:
    +Description: + +
    Name:
    +Description: + +
    Name:
    +Description: +
    +
    +

    +
    +
    + +
    +
    + diff --git a/setup/apidoc/generatedomainadmincommands.xsl b/setup/apidoc/generatedomainadmincommands.xsl new file mode 100644 index 00000000000..f500c0095a5 --- /dev/null +++ b/setup/apidoc/generatedomainadmincommands.xsl @@ -0,0 +1,152 @@ + + + + + + + + + +CloudStack | The Power Behind Your Cloud + + + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    +
    + + + + CloudStack v2.2.13 - 2.2.14 Domain Admin API Reference + +

    +

    +

    +
    +
    + + +
    + +
    +
    +
    +

    Request parameters

    + + + + + + + + + + + + + + + + + + + + + +
    Parameter NameDescriptionRequired
    +
    + + +
    +

    Response Tags

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Response NameDescription
    + +
    + + +
    +
    + + +
    +
    + + + + + +
    +
    +
    + + +
    +
    + diff --git a/setup/apidoc/generategenericcommand.xsl b/setup/apidoc/generategenericcommand.xsl new file mode 100644 index 00000000000..bf055802f10 --- /dev/null +++ b/setup/apidoc/generategenericcommand.xsl @@ -0,0 +1,39 @@ + + + + +Cloudstack API + + + + + + + + + + + + + + + + +
    NameDescriptionRequest ParametersResponse Parameters
    + +
    Name:
    +Description: +
    Required:
    +
    +
    + +
    Name:
    +Description: +

    +
    +
    + +
    +
    + diff --git a/setup/apidoc/generatetoc.xsl b/setup/apidoc/generatetoc.xsl new file mode 100644 index 00000000000..ab209db8003 --- /dev/null +++ b/setup/apidoc/generatetoc.xsl @@ -0,0 +1,1128 @@ + + + + +Cloudstack API + + + +

    Cloudstack API Version 2.2

    +
    +

    Table of Contents

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Name

    Description

    OS Specific Commands



    OS Specific Command Descriptions



    Domain Specific Commands



    Domain Specific Command Descriptions



    Virtual Machine Specific Commands



    Virtual Machine Specific Command Descriptions



    Hypervisor Specific Commands



    Hypervisor Specific Command Descriptions



    Lun Specific Commands



    Lun Specific Command Descriptions



    Template Specific Commands



    Template Specific Command Descriptions



    Storage Pool Specific Commands



    Storage Pool Specific Command Descriptions



    Firewall Specific Commands



    Firewall Specific Command Descriptions



    VM Group Specific Commands



    VM Group Specific Command Descriptions



    Vlan Specific Commands



    Vlan Specific Command Descriptions



    Router Specific Commands



    Router Specific Command Descriptions



    Service Offering Specific Commands



    Service Offering Specific Command Descriptions



    Network Specific Commands



    Network Specific Command Descriptions



    Configuration Specific Commands



    Configuration Specific Command Descriptions



    Account Specific Commands



    Account Specific Command Descriptions



    Registration Specific Commands



    Registration Specific Command Descriptions



    Zone Specific Commands



    Zone Specific Command Descriptions



    Security Group Specific Commands



    Security Group Specific Command Descriptions



    Alert Specific Commands



    Alert Specific Command Descriptions



    Pod Specific Commands



    Pod Specific Command Descriptions



    Async job Specific Commands



    Async job Specific Command Descriptions



    Resource limit Specific Commands



    Resource limit Specific Command Descriptions



    Cloudstack Specific Commands



    Cloudstack Specific Command Descriptions



    Network Offering Specific Commands



    Network Offering Specific Command Descriptions



    Volume Specific Commands



    Volume Specific Command Descriptions



    Ip Address Specific Commands



    Ip Address Specific Command Descriptions



    VPN Specific Commands



    VPN Address Specific Command Descriptions



    Event Specific Commands



    Event Specific Command Descriptions



    Load Balancer Specific Commands



    Load Balancer Specific Command Descriptions



    Iso Specific Commands



    Iso Specific Command Descriptions



    Certificate Specific Commands



    Certificate Specific Command Descriptions



    Host Specific Commands



    Host Specific Command Descriptions



    Snapshot Specific Commands



    Snapshot Specific Command Descriptions



    Disk Offering Specific Commands



    Disk Offering Specific Command Descriptions



    NAT Specific Commands



    NAT Specific Command Descriptions



    Capacity Specific Commands



    Capacity Specific Command Descriptions



    User Specific Commands



    User Specific Command Descriptions



    System VM Specific Commands



    System VM Specific Command Descriptions



    + +
    +
    + diff --git a/setup/apidoc/generatetoc_footer.xsl b/setup/apidoc/generatetoc_footer.xsl new file mode 100644 index 00000000000..fc5bd393706 --- /dev/null +++ b/setup/apidoc/generatetoc_footer.xsl @@ -0,0 +1,32 @@ + + + + + + + + + + + + +
    + + + + + + diff --git a/setup/apidoc/generatetoc_header.xsl b/setup/apidoc/generatetoc_header.xsl new file mode 100644 index 00000000000..d8da9e9a8e3 --- /dev/null +++ b/setup/apidoc/generatetoc_header.xsl @@ -0,0 +1,52 @@ + + + + + + + + + +CloudStack | The Power Behind Your Cloud + + + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + +
    +
    + +

    CloudStack API Documentation (v2.2.13 - 2.2.14)

    +
    +
    +

    Using the CloudStack API

    +

    For information about how the APIs work, and tips on how to use them, see the + Developer's Guide.

    +
    +
    + +
    +

    %API_HEADER%

    + Commands available through the developer API URL and the integration API URL. +
    +

    (A) implies that the command is asynchronous.

    +

    (*) implies element has a child.

    +
    diff --git a/setup/apidoc/generateusercommands.xsl b/setup/apidoc/generateusercommands.xsl new file mode 100644 index 00000000000..fd6df5f2183 --- /dev/null +++ b/setup/apidoc/generateusercommands.xsl @@ -0,0 +1,150 @@ + + + + + + + + + +CloudStack | The Power Behind Your Cloud + + + +
    +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + CloudStack v2.2.13 - 2.2.14 User API Reference + +

    +

    +

    +
    +
    + + +
    + +
    +
    +
    +

    Request parameters

    + + + + + + + + + + + + + + + + + + + + + +
    Parameter NameDescriptionRequired
    +
    + + +
    +

    Response Tags

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Response NameDescription
    + +
    + + +
    +
    + + +
    +
    + + + + + +
    +
    +
    + + +
    +
    + diff --git a/setup/apidoc/images/api_bullets.gif b/setup/apidoc/images/api_bullets.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7ea2f6b9bc45b583e753c6684867f6973a66ae6 GIT binary patch literal 45 ucmZ?wbhEHbWMyDwXkcJqw25F~U{L(Y0wft2bU*}1hJlHtrGI4vgEat@um*7e literal 0 HcmV?d00001 diff --git a/setup/apidoc/images/back_button.gif b/setup/apidoc/images/back_button.gif new file mode 100644 index 0000000000000000000000000000000000000000..509f2565ae48d7b6d823dc7dbc13567fce5b86b1 GIT binary patch literal 870 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 literal 0 HcmV?d00001 diff --git a/setup/apidoc/images/ins_buttonshadow.gif b/setup/apidoc/images/ins_buttonshadow.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac34ec859c9870a61b8590da4a512b2083794ecc GIT binary patch literal 1683 zcmV;E25k99Nk%w1VNd}M0M!5h{QUg*`1t$#`|$Aa^z`)i_xJVn_4fAm^78WP>gw$5 z?C$RF+S=Os`ufn&(CO*v+A9H@#f~{+}zyZ;o;)q;_dD2;Nal%^Yi57(b3V@*Vo(I+uhyW)6>(= z&d$op%GA`<*4Ea{%*@Zv&&9>X&CSim#>T|N#K_3V$H&J200000000000000000000 z00000A^8LV00000EC2ui08jxA000L6K!9*aEEgbV{vSuh>RIpzV6U z;IMey3;dq<(pLV{~kCMgmEyW?Fcqd!hx228W%N8NI%}2*DD;!V<>E#{F?p}^a|P6)cMrU&CCAF z$dC~mh~Ss6N}V1ZvQ^*@Dl%oHK+IFi)}mdJd=U)zkC_L33$n43_b!3SlL;QET>0RG z%aB9HQ|5po0sB$ijgy5NINRF!-0ke)^?m8fdg(R#|+GxrfwHKk0=5t)y$HPmZw4Kw7cZ@xD4>+iod?7Q#1_Rfm~yzeFo z=(;E9c_*DMWV&I5ABI}uiKUu~s%S87CgY4G_{P{#vudEDakqZ(09f{1uz-+6N|H;k z4Fw>GE|TPhz<1DKLyogBVVRyzh*{v}m)DBPnYP<@ke|0{5-9Gc5OQknr4Y+$r@9RH zDQKc#hb^|kfp*=e!y5LXjIv8A5&=TdjOaXEr9&qnW8+#{WevHHivR{UC)J z#xDEpwAa4>>4dI>XtAhplbZ2<8*^;;-MF=?H>|PBilfPX8^_hkf@AY?;nB%Fvs-+e zLKh;8IR1Ds{y-CwNR>NlWzbm_rsbAJw|DfH*0wsI(zR(O8|kmLW;%=f_wWDzz|&s` zU?V)))Q2-4lb>!PQ?14*#y3XmlB|@c0SHu31U=DFt*|l^Tz!Qc7XZ>UoTCi1WW;)m zxP`E?=MX*E>}E`I!~qCk0E7IZ7{dr3l%nyGX1Hv8Aq=8D%CQX}eI+F;8%#`Y#l)D{ z3QJX~Rjp_x0t;FZDmRi~1dTQ_3-soTy?IXD6KTgQkpV3(DP&}zp^rwkS8qOP)9w!agUIcMRI)XW3P4zkX{Mo zdj$CfTRd?+nlVHWh)kw3OVN;HzVMie#6=?;c?n3S<(k;U;UtaGk#2hPo8SzmILCRG dZK5Tc=!}jHFEPzVegc~CL}tyFNsAx=06VJEaGwAG literal 0 HcmV?d00001 diff --git a/setup/apidoc/images/insdownload_button.gif b/setup/apidoc/images/insdownload_button.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb5cb5e700fdd6fa146fabbb76a281a836a10d56 GIT binary patch literal 2531 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 SBkxP9-lEy0-!K@2&Hn-BBw)S( literal 0 HcmV?d00001 diff --git a/setup/apidoc/images/insjoincomm_button.gif b/setup/apidoc/images/insjoincomm_button.gif new file mode 100644 index 0000000000000000000000000000000000000000..f149c8506c195e295543c730455dcb9d75e109b2 GIT binary patch literal 2627 zcmV-J3cU44Nk%w1VW|Kh0QUd@4J9)>WqdwqfkADBifHXQiQd3mO&e8Vw_>7EP%gP7o~5qh>`H}^sv0c`TF{*ud;cOoz&UeTXcd! zM@mm&Yq-J2c88F4fr-)4(G)E^9Xw5xpQT}HZ(?F%5i2@5OjkEIH*9QdHCSur>g>zW z)DI^$wzjrrb$;96;}aAWrlzJFIZ3a&!T9<5VR3rH%h31u`8Q8pJWpDQm!IJ0>vDmK zU2=Vcke1om*$D~?aes$BafN@5myMvRgQ2l=fQS40{Ar7xy2#M-^76pX*MEzXij|vX zdxnRSm}Yl?X^o+AeuZRhb3;QznV+ISNKKQTr0DDHhL)a1S7JkLgg9JqqNJp?!^$;f zc)rESZ*z1tNmVLKU07sl$IH!mhK`}O!mX{Xf|Q&%X?=f+k&Kz45GOUj!o%R><&~tX zB`GWC>gy2^5jt&wJVHiiXJ>7HiEn&^H(hgIUth7bwvwr~J!N|6=;<6C9h8)mVq;`` zdwV`VK9QWGA^8LV00000EC2ui0I2{V000R80K*6r7zan4Q0M?CT*$DY!-o(fN}Ncs zqQ#3CGdjG(@eVjz8bgX4NwTC#j8jr7+obSRs8r#kF_=lSrp=o;bL!m5v!~CWK!Xac znKIbIEVm3OUCOkn)2C3QN}Wozs@1DlvqDXSV_~%e1j33POSY`pvuM+*UCXwu+qZDh z=F6hc(t*2p^XlEpx3Ay7fCCF2Ot`RNz2-bsVz+8n6@}dzNS;i&vgON|Gi%<=xwGfb zphHtW=4{IT2NH)nM z4ilKMO%!iT(2kQ>W~t?nQJAu$97b;GV=7xHf(RB#q^V{Sn`}bCn{dV{ClM16A?KZV z=2<5Nbmr+NoGpkD=OlanY3QMd<|)D?iQdVEB3w8T#H5r?>Vpp+WUA?=oYF}|rcJak z0SG{3N`(lS<^Ti}qvpV=2O>=W07(~ghAJx+ngSte3r)OA#RR=-+DI4YfGR4fnu^dx ztRgg$!>FZtpem~^P|<~mOqhzQwyCb#YNlPdnga+es2Z&YO~~=;tI-gGML$BsD{s6y z=285A+XB+ zxQ8G^?#Ay9{O`o$PJHhnL?6N{6YMTS^~&QOeD1+-FGC32|DHSs&0~;!`OS}S{_)=z ze>?_^fFBDW*(=Wv9AD(G$plN}PX`^G;KT+7NWcOPa0CaO00I?QKn0Fq0s{BmAo(FkOiz!Bs~Nl##-44AaS1bTqU|8d}xpbRA_!7u?8aG(?*_@oLz z5CaZq!3!_oKny1E$rqTimbVP$1i&CmT7Ghtwe&(Ok01*-h>`=OG=Uam2?8S^fdi{- zQI>mbW|{)sYGkqftIqgo&2Q4 z1Y`=*f6jsgYLJ3b6Oo1q6hjbFxPVlrO4X{)!3IO9Y7J~qgQ|M)2Oo}r z3}|431uVEn09MT67Q6VxFpjZ|XH4T7+xW&f&asYbtPK!=01)D^h5&|4!;cms}1Mqu3V17=V_y%;he7`O9DqvzW(B<}#c4%xF$?nBQS#6br*3 l7{Fi#0_IHTI@|fqc+Rt)_sr)$`}xm+4z!@}+>3w!06W7|6?Oms literal 0 HcmV?d00001 diff --git a/setup/apidoc/images/insjoincomm_button_hover.gif b/setup/apidoc/images/insjoincomm_button_hover.gif new file mode 100644 index 0000000000000000000000000000000000000000..74df0a60e64a76c6151d51cf524a493d467230e9 GIT binary patch literal 2620 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 literal 0 HcmV?d00001 diff --git a/setup/apidoc/includes/main.css b/setup/apidoc/includes/main.css new file mode 100644 index 00000000000..29804e876a4 --- /dev/null +++ b/setup/apidoc/includes/main.css @@ -0,0 +1,1073 @@ +@charset "UTF-8"; +/* CSS Document */ + + +*{ + margin:0; + padding:0; +} + +body{ + font-family:Arial, Helvetica, sans-serif; + font-size:12px; + color:#333; + font-weight:normal; + background:#FFF repeat top left; + margin:0; + padding:0; +} + + +#inside_wrapper { + width:auto; + height:auto; + margin:0; + padding:0; + overflow:hidden; +} + +#insidetopbg { + width:100%; + height:auto; + margin:0; + padding:0; + overflow:hidden; +} + +.uppermenu_panel { + width:100%; + height:auto; + float:left; + margin:0; + padding:0; +} +.uppermenu_box { + width:auto; + height:29px; + float:right; + margin:0; + padding:0; + +} + +.uppermenu { + width:300px; + height:auto; + float:left; + color:#FFF; + font-size:13px; + font-weight:normal; + text-align:left; + padding:0; + margin:4px 10px 0 0; +} + +.uppermenu a:link { + width:auto; + height:auto; + color:#54bfd3; + font-weight:normal; + text-align:left; + text-decoration:none; + margin:0 5px 0 5px; + +} + +.uppermenu a:visited { + width:auto; + height:auto; + color:#54bfd3; + font-weight:normal; + text-align:left; + text-decoration:none; + margin:0 5px 0 5px; + +} + +.uppermenu a:hover { + width:auto; + height:auto; + color:#ccf004; + font-weight:normal; + text-align:left; + text-decoration:none; + margin:0 5px 0 5px; + +} + + +#main_master { + width:960px; + height:auto; + margin:0 auto; + padding:0; +} + +#inside_header { + width:960px; + height:auto; + float:left; + margin:0 0 0 0; + padding:0; +} + +.header_top { + width:960px; + height:67px; + float:left; + margin:0; + padding:0; +} + +.header_bot { + width:960px; + height:352px; + float:left; + margin:0; + padding:0; +} + +.insideheader_bot { + width:960px; + height:91px; + float:left; + margin:0; + padding:0; +} + +.insideheader_botleft { + width:620px; + height:91px; + float:left; + margin:0; + padding:0; +} + +.insideheader_botleft h1 { + width:auto; + height:auto; + float:left; + color:#199cb4; + font-size:30px; + text-align:left; + font-weight:normal; + letter-spacing:1px; + margin:30px 0 0 0; + padding:0; +} + +.insideheader_botright { + width:340px; + height:91px; + float:left; + margin:0; + padding:0; +} + +.insideheader_button { + width:340px; + height:32px; + float:left; + margin:30px 0 0 0; + padding:0; +} + +a.insjoincomm_button { + width:169px; + height:32px; + float:left; + background:url(../images/insjoincomm_button.gif) no-repeat top left; + margin:0; + padding:0; +} + +a:hover.insjoincomm_button { + background:url(../images/insjoincomm_button_hover.gif) no-repeat top left; +} + +a.insdownload_button { + width:171px; + height:32px; + float:left; + background:url(../images/insdownload_button.gif) no-repeat top left; + margin:0; + padding:0; +} + +a:hover.insdownload_button { + background:url(../images/insdownload_button_hover.gif) no-repeat top left; +} + +.insheader_buttonshadow { + width:336px; + height:14px; + float:left; + background:url(../images/ins_buttonshadow.gif) no-repeat top left; + margin:0; + padding:0; +} +.header_botright { + width:550px; + height:352px; + float:left; + margin:0; + padding:0; +} + +.clear { + clear:both; +} + + +a.cloud_logo { + width:300px; + height:51px; + float:left; + background:url(../images/cloudstack.png) no-repeat top left; + margin:8px 0 0 0; + padding:0; +} + +.mainemenu_panel { + width: 801px; + height:51px; + float:left; + margin:0; + padding:0; +} + +.mainemenu_links { + width: auto; + height:auto; + float:right; + margin:30px 0 0 0; + padding:0; +} + +.mainemenu_links a:link { + width: auto; + height:auto; + font-size:18px; + text-align:left; + font-weight:normal; + text-decoration:none; + color:#FFF; + margin:0 25px 0 0; + padding:0; +} + +.mainemenu_links a:visited { + width: auto; + height:auto; + font-size:18px; + text-align:left; + font-weight:normal; + text-decoration:none; + margin:0 25px 0 0; + padding:0; + color:#FFF; +} + +.mainemenu_links a:hover { + width: auto; + height:auto; + font-size:18px; + text-align:left; + font-weight:normal; + text-decoration:none; + margin:0 25px 0 0; + padding:0; + color:#FFF; +} + +#main_content { + width:960px; + min-height:600px; + height:auto; + float:left; + margin:0; + padding:0; +} + +.main_homecontent_left { + width:600px; + height:auto; + float:left; + margin:0; + padding:0; +} + +.home_introbox { + width:600px; + height:auto; + float:left; + margin: 25px 0 0 0; + padding:0; +} + +.home_introbox h1 { + width:600px; + height:auto; + float:left; + color:#199cb4; + text-align:left; + font-weight:normal; + font-size:22px; + margin:0; + padding:0; +} + +.home_introbox p { + width:600px; + height:auto; + float:left; + text-align:justify; + font-weight:normal; + line-height:22px; + font-size:18px; + margin:10px 0 0 0; + padding:0; +} +.main_homecontent_right { + width:311px; + height:auto; + float:right; + margin:0; + padding:0; +} + +#news_panel { + width:600px; + height:auto; + float:left; + margin:30px 0 0 0; + padding:0; +} + +#news_panel h2 { + width:auto; + height:auto; + float:left; + color:#199cb4; + font-size:18px; + font-weight:normal; + text-align:left; +} + +.news_box { + width:600px; + height:auto; + float:left; + margin:15px 0 0 0; + padding:0; +} + +.news_box a:link { + width:600px; + height:auto; + float:left; + color:#105f8b; + text-align:left; + text-decoration:none; + font-weight:normal; + font-size:15px; +} + +.news_box a:visited { + width:600px; + height:auto; + float:left; + color:#105f8b; + text-align:left; + text-decoration:none; + font-weight:normal; + font-size:15px; +} + +.news_box a:hover { + width:600px; + height:auto; + float:left; + color:#666; + text-align:left; + text-decoration:none; + font-weight:normal; + font-size:15px; +} + +.news_box p { + width:600px; + height:auto; + float:left; + margin:8px 0 0 0; + text-align:left; + font-size:12px; + font-weight:normal; + padding:0; +} + +.news_box span { + width:auto; + height:auto; + float:left; + margin:0; + color:#999; + text-align:left; + font-size:11px; + font-weight:normal; + padding:0; +} + +#partners_panel { + width:311px; + height:auto; + float:left; + margin:30px 0 0 0; + padding:0; +} + +#partners_panel h2 { + width:300px; + height:auto; + float:left; + color:#199cb4; + font-size:18px; + font-weight:normal; + text-align:left; +} + +.partners_box { + width:310px; + height:auto; + float:left; + border-bottom:1px solid #CCC; + margin:15px 0 0 0; +} + +.partners_box_logo { + width:auto; + height:auto; + float:left; + display:block; + margin:0 0 10px 0; + padding:0; + border:0; +} + +.partners_box_small { + width:155px; + height:80px; + float:left; + margin:0; + padding:0; +} + +.readmore_box { + width:100%; + height:29px; + float:left; + margin:15px 0 0 0; + padding:0; +} + +.readmore_box a:link { + width:auto; + height:auto; + float:right; + color:#105f8b; + font-size:12px; + font-weight:normal; + text-decoration:none; + text-align:right; + margin:0 10px 0 0; + padding:0; +} + +.readmore_box a:visited { + width:auto; + height:auto; + float:right; + color:#105f8b; + font-size:12px; + font-weight:normal; + text-decoration:none; + text-align:right; + margin:0 10px 0 0; + padding:0; +} + +.readmore_box a:hover { + width:auto; + height:auto; + float:right; + color:#105f8b; + font-size:12px; + font-weight:normal; + text-decoration:underline; + text-align:right; + margin:0 10px 0 0; + padding:0; +} + +#footer { + width:100%; + height:auto; + background:#cdcdcd repeat top left; + margin:25px 0 0 0; + padding:0 0 10px 0; + float:left; +} + +#inside_footer { + width:100%; + height:auto; + background:#cdcdcd repeat top left; + margin:25px 0 0 0; + padding:0; + position:absolute; + bottom:0; +} + + +#footer_mainmaster { + width:960px; + height:auto; + margin:0 auto; + padding:0; +} + +#footer_mainmaster p{ + width:100%; + height:auto; + float:left; + margin:15px 0 0 0; + text-align:left; + font-size:11px; + font-weight:normal; + padding:0; +} + +.footer_linksbox { + width:180px; + height:auto; + float:left; + margin: 15px 20px 20px 0; + padding:0; +} + +.footer_linksbox li { + width:170px; + height:auto; + float:left; + margin: 0 0 5px 0; + border-bottom:1px solid #999; + list-style:none; + padding:0; +} + +.footer_linksbox a:link { + width:auto; + height:auto; + float:left; + font-size:11px; + font-weight:normal; + color:#666; + text-decoration:none; +} + +.footer_linksbox a:visited { + width:auto; + height:auto; + float:left; + font-size:11px; + font-weight:normal; + color:#666; + text-decoration:none; +} + +.footer_linksbox a:hover { + width:auto; + height:auto; + float:left; + font-size:11px; + font-weight:normal; + color:#333; + text-decoration:none; +} + +.inside_leftpanel { + width:212px; + height:auto; + float:left; + margin:0; + padding:0; +} + +.inside_rightpanel { + width:718px; + height:auto; + float:right; + margin:0; + padding:0; +} + +.inside_contentpanel { + width:700px; + height:auto; + float:left; + margin:0 0 0 0; + padding:0; +} + +.inside_contentpanel h1{ + width:700px; + height:auto; + float:left; + color:#199cb4; + font-size:20px; + font-weight:normal; + text-align:left; + margin:0; + padding:0; +} + +.inside_contentpanel h2{ + width:700px; + height:auto; + float:left; + color:#199cb4; + font-size:16px; + font-weight:normal; + text-align:left; + margin:15px 0 0 0; + padding:0; +} + + +.inside_contentpanel h3{ + width:700px; + height:auto; + float:left; + font-size:15px; + font-weight:bold; + text-align:left; + margin:15px 0 0 0; + padding:0; +} + +.inside_contentpanel h4{ + width:700px; + height:auto; + float:left; + font-size:14px; + font-weight:normal; + text-align:left; + margin:15px 0 10px 15px; + padding:0; +} + +.inside_contentpanel p { + width:100%; + height:auto; + float:left; + text-align:justify; + font-size:12px; + font-weight:normal; + margin:10px 0 0 0; + padding:0; +} + +.inside_contentpanel a:link { + width:auto; + height:auto; + color:#009fcd; + text-decoration:none; + text-align:left; + font-size:12px; + margin:0; + padding:0; +} + +.inside_contentpanel a:visited { + width:auto; + height:auto; + color:#009fcd; + text-decoration:none; + text-align:left; + font-size:12px; + margin:0; + padding:0; +} + +.inside_contentpanel a:hover { + width:auto; + height:auto; + color:#009fcd; + text-decoration:underline; + text-align:left; + font-size:12px; + margin:0; + padding:0; +} + +.download_text { + width:600px; + height:auto; + float:left; + color:#7418c2; + text-align:left; + font-weight:normal; + font-size:18px; + margin:20px 0 15px 0 +} + +.download_textbox { + width:720px; + height:auto; + float:left; + color:#333; + text-align:left; + font-weight:normal; + font-size:18px; + margin:20px 0 15px 0; + border-top:1px dashed #999; +} + +.screenshots_box { + width:454px; + height:455px; + float:left; + background:#000 repeat top left; + margin:20px 0 0 65px; + display:inline; +} + +.apiannouncement_box { + width:928px; + height:auto; + float:left; + background:#e0f4ff repeat top left; + margin:15px 0 0 0; + border:1px solid #9dd2eb; +} + +.apiannouncement_contentarea { + width:895px; + height:auto; + float:left; + margin:0 0 0 15px; + display:inline; + padding:0; +} + +.inside_apileftpanel { + width:930px; + height:left; + float:left; + margin:0; + padding:0; +} + +.api_leftsections { + width:928px; + height:auto; + float:left; + border-top:1px dashed #666; + margin:15px 0 0 0; + padding:0; +} + + + +.api_leftsections span { + width:700px; + height:auto; + float:left; + color:#666; + font-size:11px; + font-weight:normal; + text-align:left; + margin:7px 0 0 0; + padding:0; +} + +.api_legends{ + width:300px; + height:auto; + float:left; + background:#f9f9f9; + border:1px solid #e6e6e6; + margin:8px 0 0 0; + padding:0 3px 3px 0; +} + +.api_legends p{ + width:250px; + height:auto; + float:left; + color:#333; + text-align:left; + font-size:11px; + font-weight:normal; + margin:5px 0 0 5px; + padding:0; +} + +.api_legends_async{ + width:auto !important; + height:auto; + color:#2c8bbc !important; + font-size:11px; + font-weight:normal; + text-align:left; + margin:0 3px 0 0 !important; + padding:0; +} + +.api_legends_premium{ + width:auto !important; + height:auto; + color:#013150 !important;; + font-size:11px; + font-weight:normal; + text-align:left; + margin:0 3px 0 0 !important;; + padding:0; +} + +.apismallsections { + width:925px; + height:auto; + float:left; + margin:15px 0 0 0; + list-style:none; + padding:0; +} + +.apismallbullet_box { + width:231px; + height:auto; + float:left; + margin:10px 0 0 0; + list-style:none; + padding:0; +} + +.apismallbullet_box h5 { + width:120px; + height:auto; + float:left; + color:#666; + font-size:12px; + text-align:left; + font-weight:bold; + margin:0; + padding:0 0 10px 0; +} + +.apismallbullet_box h6 { + width:120px; + height:auto; + float:left; + color:#6214ab; + font-size:12px; + text-align:left; + font-weight:bold; + margin:0; + padding:0 0 10px 0; +} + +.apismallbullet_box li { + width:188px; + height:auto; + float:left; + margin:4px 0 0 0; + background:url(../images/api_bullets.gif) no-repeat top left; + padding:0 0 3px 15px; + background-position: 2px 2px; + text-align: left; + list-style:none; + border-bottom:1px dotted #999; +} + +.apismallbullet_box a{ + width:auto; + height:auto; + float:left; + color:#2c8bbc; + font-size:11px !important; + font-weight:normal; + text-align:left; + margin:0; + padding:0; + text-decoration:none; +} + +.apismallbullet_box a:link, .apismallbullet_box a:visited { + text-decoration:none; +} + +.apismallbullet_box a:hover { + text-decoration:underline; +} + +.api_tablepanel { + width:920px; + height:auto; + float:left; + margin:15px 0 0 0; + padding:0; +} + +.api_tablepanel h2{ + width:800px; + height:auto; + float:left; + color:#666; + font-size:14px; + font-weight:bold; + text-align:left; + margin:15px 0 0 0; + padding:0; +} + +.apitable { + width:100%; + height:auto; + float:left; + border:none; + border-collapse:collapse; + margin:10px 0 0 0; + padding:0; +} + +.api_usagebox { + width:700px; + height:auto; + float:left; + background:#f4f5f5; + border:1px solid #CCC; + margin:10px 0 0 30px; + padding:10px; + color:#333; + font-size:11px; + font-weight:normal; + text-align:left; +} + +.api_samplebox { + width:700px; + height:auto; + float:left; + background:#E0F4FF; + border:1px solid #9DD2EB; + margin:10px 0 0 30px; + padding:10px; + color:#333; + font-size:11px; + font-weight:normal; + text-align:left; +} + +.apitable tr { + width:100%; + height:auto; + float:left; + border-collapse:collapse; + border-bottom:1px solid #d5e8f1; + margin:0; + padding:0; +} + +.apitable tr.hed { + width:100%; + height:22px; + float:left; + background:#e7e7e7; + border-collapse:collapse; + border-top:1px solid #999; + border-bottom:1px solid #999; + margin:15px 0 0 0; + padding:0; + border-left:none; + border-right:none; +} + +.apitable td { + height:auto; + float:left; + border:none; + color:#333; + font-size:12px; + font-weight:normal; + border-collapse:collapse; + text-align:left; + padding:5px; + margin:0; +} + + +.apitable td.p{ + height:auto; + float:left; + border:none; + color:#333; + font-size:12px; + font-weight:normal; + text-align:left; + padding:5px; + margin:0; +} + + + +.api_titlebox { + width:100%; + height:auto; + float:left; + margin:0; + padding:0; +} + +.api_titlebox_left { + width:700px; + height:auto; + float:left; + margin:0; + padding:0; +} + +.api_titlebox span{ + width:600px; + height:auto; + float:left; + color:#666; + font-size:11px; + font-weight:normal; + font-style:italic; + text-align:left; + margin:10px 0 0 0; + padding:0; +} + +.api_titlebox_right { + width:200px; + height:20px; + float:right; + margin:0; + padding:0; +} + +a.api_backbutton { + width:60px !important; + height:19px !important; + float:right; + background:#F00 url(../images/back_button.gif) no-repeat top left; + margin:10px 0 0 0 !important; + padding:0; + text-decoration:none; +} + +a:hover.api_backbutton { + background:url(../images/back_button_hover.gif) no-repeat top left; +} From 37ed4b75ebf02552ec1451cbf78bf60873a04bb8 Mon Sep 17 00:00:00 2001 From: Ewan Mellor Date: Mon, 13 Feb 2012 14:29:14 -0800 Subject: [PATCH 02/14] Added a 'Simulator' entry to the category list. --- setup/apidoc/gen_toc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup/apidoc/gen_toc.py b/setup/apidoc/gen_toc.py index a4d5c958e1d..f0d6d2ed4c1 100644 --- a/setup/apidoc/gen_toc.py +++ b/setup/apidoc/gen_toc.py @@ -40,6 +40,7 @@ dirname_to_dirname = { known_categories = { + 'Simulator': 'Simulator', 'SystemVm': 'System VM', 'VirtualMachine': 'Virtual Machine', 'VM': 'Virtual Machine', From d85cc8194ba6b5402b5372ec3fd53fb081e7fe98 Mon Sep 17 00:00:00 2001 From: Ewan Mellor Date: Mon, 13 Feb 2012 14:31:50 -0800 Subject: [PATCH 03/14] Hard-code version number for the zip file, since ${version} is wrong on this branch. --- build/developer.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/developer.xml b/build/developer.xml index 2412edbec6e..8e928baa363 100755 --- a/build/developer.xml +++ b/build/developer.xml @@ -397,8 +397,8 @@ - - + + From 6094787cdbae4ed10e5aec5f9c78e920d016ecde Mon Sep 17 00:00:00 2001 From: Naredula Janardhana Reddy Date: Tue, 14 Feb 2012 14:10:46 +0530 Subject: [PATCH 04/14] Bug 12808: ignoring errors on delete. Reviewed-by: Abhi --- patches/systemvm/debian/config/root/firewall.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/patches/systemvm/debian/config/root/firewall.sh b/patches/systemvm/debian/config/root/firewall.sh index 331de402f21..14e25ad22ba 100755 --- a/patches/systemvm/debian/config/root/firewall.sh +++ b/patches/systemvm/debian/config/root/firewall.sh @@ -78,9 +78,9 @@ tcp_or_udp_entry() { --destination-port $port -j DNAT \ --to-destination $instIp:$dport &>> $OUTFILE || [ "$op" == "-D" ]) && (sudo iptables -t mangle $op PREROUTING --proto $proto -i $dev -d $publicIp \ - --destination-port $port -j MARK --set-mark $tableNo) && + --destination-port $port -j MARK --set-mark $tableNo &>> $OUTFILE || [ "$op" == "-D" ]) && (sudo iptables -t mangle $op PREROUTING --proto $proto -i $dev -d $publicIp \ - --destination-port $port -m state --state NEW -j CONNMARK --save-mark) && + --destination-port $port -m state --state NEW -j CONNMARK --save-mark &>> $OUTFILE || [ "$op" == "-D" ]) && (sudo iptables -t nat $op OUTPUT --proto $proto -d $publicIp \ --destination-port $port -j DNAT \ --to-destination $instIp:$dport &>> $OUTFILE || [ "$op" == "-D" ]) && @@ -193,9 +193,9 @@ static_nat() { # shortcircuit the process if error and it is an append operation # continue if it is delete (sudo iptables -t mangle $op PREROUTING -i $dev -d $publicIp \ - -j MARK --set-mark $tableNo) && + -j MARK --set-mark $tableNo &>> $OUTFILE || [ "$op" == "-D" ]) && (sudo iptables -t mangle $op PREROUTING -i $dev -d $publicIp \ - -m state --state NEW -j CONNMARK --save-mark) && + -m state --state NEW -j CONNMARK --save-mark &>> $OUTFILE || [ "$op" == "-D" ]) && (sudo iptables -t nat $op PREROUTING -i $dev -d $publicIp -j DNAT \ --to-destination $instIp &>> $OUTFILE || [ "$op" == "-D" ]) && (sudo iptables $op FORWARD -i $dev -o eth0 -d $instIp -m state \ From a19dff444c77780f4decf2b2ea61866eb5057e16 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 14 Feb 2012 16:01:20 -0800 Subject: [PATCH 05/14] bug 13637: don't send ENTER/BACKSPACE in javascript KEY-PRESS event. Reviewed-By: Anthony --- console-proxy/js/ajaxviewer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/console-proxy/js/ajaxviewer.js b/console-proxy/js/ajaxviewer.js index 14c80fde5c1..3c49f9a701d 100644 --- a/console-proxy/js/ajaxviewer.js +++ b/console-proxy/js/ajaxviewer.js @@ -323,6 +323,10 @@ JsCookedKeyboardMapper.prototype.inputFeed = function(eventType, code, modifiers this.mappedInput.push({type : AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers}); return; } + + // ENTER/BACKSPACE key should already have been sent through KEY DOWN/KEY UP event + if(code == AjaxViewer.JS_KEY_ENTER || code == AjaxViewer.JS_KEY_BACKSPACE) + return; this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: X11Keysym, modifiers: modifiers}); this.mappedInput.push({type : AjaxViewer.KEY_UP, code: X11Keysym, modifiers: modifiers}); From 1a1a2e74c2d1195c6d96bf2288324031eb643ccb Mon Sep 17 00:00:00 2001 From: Edison Su Date: Tue, 14 Feb 2012 16:16:28 -0800 Subject: [PATCH 06/14] bug 13698: set max processes per user is ulimited status 13698: resolved fixed Reviewed-by: alex --- python/lib/cloudutils/serviceConfigServer.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/python/lib/cloudutils/serviceConfigServer.py b/python/lib/cloudutils/serviceConfigServer.py index e80b1ed71bd..3e4c5931b7f 100644 --- a/python/lib/cloudutils/serviceConfigServer.py +++ b/python/lib/cloudutils/serviceConfigServer.py @@ -64,7 +64,13 @@ class cloudManagementConfig(serviceCfgBase): #distro like sl 6.1 needs this folder, or tomcat6 failed to start bash("mkdir /var/log/cloud-management/") - + #set max process per account is unlimited + if os.path.exists("/etc/security/limits.conf"): + cfo = configFileOps("/etc/security/limits.conf") + cfo.add_lines("cloud soft nproc -1\n") + cfo.add_lines("cloud hard nproc -1\n") + cfo.save() + try: self.syscfg.svo.disableService("tomcat6") except: From 91c35c72fef427899c5260f52401813066f1a94f Mon Sep 17 00:00:00 2001 From: Edison Su Date: Wed, 15 Feb 2012 14:50:28 -0800 Subject: [PATCH 07/14] bug 13647: adding iptables rules failed, sleep and retry status 13647: resolved fixed Reviewed-by: Frank --- python/lib/cloudutils/serviceConfig.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/python/lib/cloudutils/serviceConfig.py b/python/lib/cloudutils/serviceConfig.py index e8f5f9bdbba..f9379020490 100755 --- a/python/lib/cloudutils/serviceConfig.py +++ b/python/lib/cloudutils/serviceConfig.py @@ -543,7 +543,16 @@ class firewallConfigBase(serviceCfgBase): pass if not status: - bash("iptables -I INPUT -p tcp -m tcp --dport %s -j ACCEPT"%port) + redo = False + result = True + try: + result = bash("iptables -I INPUT -p tcp -m tcp --dport %s -j ACCEPT"%port).isSuccess() + except: + redo = True + + if not result or redo: + bash("sleep 30") + bash("iptables -I INPUT -p tcp -m tcp --dport %s -j ACCEPT"%port) def config(self): try: From 3c10c624dd58988d9e479f195b5f91a464acff5f Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Wed, 15 Feb 2012 15:32:01 -0800 Subject: [PATCH 08/14] bug 13733: allow dhcp requests and responses all the time --- scripts/vm/hypervisor/xenserver/vmops | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index 4e650b7709f..150f44e0977 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -397,6 +397,8 @@ def can_bridge_firewall(session, args): try: util.pread2(['iptables', '-N', 'BRIDGE-FIREWALL']) util.pread2(['iptables', '-I', 'BRIDGE-FIREWALL', '-m', 'state', '--state', 'RELATED,ESTABLISHED', '-j', 'ACCEPT']) + util.pread2(['iptables', '-A', 'BRIDGE-FIREWALL', '-m', 'physdev', '--physdev-is-bridged', '-p', 'udp', '--dport', '67', '--sport', '68', '-j', 'ACCEPT']) + util.pread2(['iptables', '-A', 'BRIDGE-FIREWALL', '-m', 'physdev', '--physdev-is-bridged', '-p', 'udp', '--dport', '68', '--sport', '67', '-j', 'ACCEPT']) util.pread2(['iptables', '-D', 'FORWARD', '-j', 'RH-Firewall-1-INPUT']) except: util.SMlog('Chain BRIDGE-FIREWALL already exists') From 1325509291b37bcf511554b0d760730e5bd34aeb Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 14 Feb 2012 11:49:16 -0800 Subject: [PATCH 09/14] bug 13537: use --no-same-owner when we untar OVA file to work with NFSv4. Reviewed-By: Anthony --- .../vmware/manager/VmwareStorageManagerImpl.java | 13 +++++++++---- .../com/cloud/storage/template/VmdkProcessor.java | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java index 4a8b107efd8..30d11a8bbf5 100644 --- a/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java +++ b/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java @@ -619,12 +619,15 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { } // untar OVA file at template directory - command = new Script("tar", 0, s_logger); + command = new Script("tar", 0, s_logger); + command.add("--no-same-owner"); command.add("-xf", installFullName); command.setWorkDir(installFullPath); - result = command.execute(); + s_logger.info("Executing command: " + command.toString()); + result = command.execute(); if(result != null) { - String msg = "unable to copy snapshot " + snapshotFullName + " to " + installFullPath; + String msg = "unable to untar snapshot " + snapshotFullName + " to " + + installFullPath; s_logger.error(msg); throw new Exception(msg); } @@ -702,8 +705,10 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { String srcFileName = getOVFFilePath(srcOVAFileName); if(srcFileName == null) { Script command = new Script("tar", 0, s_logger); + command.add("--no-same-owner"); command.add("-xf", srcOVAFileName); - command.setWorkDir(secondaryMountPoint + "/" + secStorageDir); + command.setWorkDir(secondaryMountPoint + "/" + secStorageDir); + s_logger.info("Executing command: " + command.toString()); String result = command.execute(); if(result != null) { String msg = "Unable to unpack snapshot OVA file at: " + srcOVAFileName; diff --git a/core/src/com/cloud/storage/template/VmdkProcessor.java b/core/src/com/cloud/storage/template/VmdkProcessor.java index bd354642fdd..f3dbbda3fea 100644 --- a/core/src/com/cloud/storage/template/VmdkProcessor.java +++ b/core/src/com/cloud/storage/template/VmdkProcessor.java @@ -63,7 +63,8 @@ public class VmdkProcessor implements Processor { String templateFileFullPath = templatePath + templateName + "." + ImageFormat.OVA.getFileExtension(); File templateFile = new File(templateFileFullPath); - Script command = new Script("tar", 0, s_logger); + Script command = new Script("tar", 0, s_logger); + command.add("--no-same-owner", templateFileFullPath); command.add("-xf", templateFileFullPath); command.setWorkDir(templateFile.getParent()); String result = command.execute(); From 1f679f2542cc6ecbcbc468b1dea075a4006968f0 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Wed, 15 Feb 2012 16:18:25 -0800 Subject: [PATCH 10/14] bug 13777: propagate snapshot packaging failures up. Reviewed-By: Anthony --- .../src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index 4a2624426bf..382d1eb8cb0 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -1254,6 +1254,8 @@ public class VirtualMachineMO extends BaseMO { String result = command.execute(); if(result == null) { success = true; + } else { + s_logger.error("failed to execute command: " + command.toString()); } } } @@ -1270,6 +1272,7 @@ public class VirtualMachineMO extends BaseMO { if(!success) { new File(exportDir + File.separator + exportName + ".ova").delete(); + throw new Exception("Unable to finish the whole process to package as a OVA file"); } } } From 4b7543f9a62a419b096937b9b5928d608c5b1e26 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Wed, 15 Feb 2012 17:47:45 -0800 Subject: [PATCH 11/14] bug 13609: libvirt-java doesn't handle error 72, rebuild the jar status 13609: resolved fixed Reviewed-by: frank --- deps/cloud-libvirt-0.4.5.jar | Bin 67513 -> 68899 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/deps/cloud-libvirt-0.4.5.jar b/deps/cloud-libvirt-0.4.5.jar index a8ae3f2605d422955ea3fb3a50182ca66a53fb5d..9d0a1dfbe609c5a428071eccec25a4565cbcf9d4 100644 GIT binary patch delta 32540 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 z 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
    Fm%F#l_A`8EPv78 zrU{VY!dKn}%hl&i5WT}CL!dMEE#)q1xn4K`nl#lF2l)LaNW}4y$?S;e+6)4Y$lz6+ zfz%_$s}31=oh4@k6?_L4+FR@aZa}jq{jK^gEbJyR9o#SI7Q>=DK;uRC9|oHD*aoiP zh_-@$jPw@6Lr*}|haAZGb2Fl4f5_mGeS!Wz*G6%ZmJJ6-c8lF20FVr(xUl|<#$5Ep zP5Lez9Mdh@z(9Z|9v=`4B?1CYuIVETh7~UY=fA+hc#B>>_>%rCjPQc~qW>-(&iXMK z{P6Qj6xqq;>3<0pI{~{j^b%}$LUGl#H|fCt9?s#gOWM{G&}IK4c?J~G9tDCKZ&k>7 zN(L_x1A++v)6*Nr5(I*KUjP}WbXS#Kry7DyVZPOriUc73j1>{kuvIy`Xr0MbmL{o8dF zzX9n;fT1E}K=pq-Q1*Z3b79)I9&g{O@@MfSJyr!etPK-#t$q>) z1av^2jl2UHzzIV7SBG&SgNV1E0fA|TTS~b|nkYfQKB)%F?OBc67hryo5Wt$j z1x|NwhU)_gs6ySuKR6V?VD`T@o&V)nunKJ96j*Ni9{8yX##d+%WY}9&2olT`6@q_t z;@-M5xYa+$x45n+F|c7&P?zJc|A@SS-$euA_%r{&QDKH?kn5=#%=ZGxGkc{6aBy&a zIfM;g;GDl*;?N;?uQa=LGjU5Z<2jJ_?tiS!xM`hp6C?}*dzIrBL&bNPBnE^MR*L>V zDh;87)vnH8Vu0ustpCVc)t;Uc1Z8~(3(YNgBtI^=uAQIB$+PnjkN^uLynVrYu?X;N z5&;j^?*OsU$X6G=3oEzEK~-x2dG^6_d-9#L^bZfoe>9R6kLv6I8MeT3dx+mGgG>}K uV@wF~RsUVzB7wxWwJKQwiCJ#>P}mSA*c-1`F9rd2jtQYcj#&fw;Qk-e%Kf1L From 8516186db1823f183875c8944d64626388453026 Mon Sep 17 00:00:00 2001 From: prachi Date: Thu, 16 Feb 2012 17:20:54 -0800 Subject: [PATCH 12/14] Bug 13824 - VM Deployment: If Root Volume is Ready, Planner should reuse the storagepool until cluster has capacity Reviewed-By: Alex Changes: - Reuse the same storagepool where the Volume is ready on each retry of VM deployment until the cluster where the volume is has capacity - After the cluster is out of capacity, we look in other clusters and find a new storagepool. - At this point if the volume is recreatable on the new storagepool, depoyment will succeed provided everytyhing else goes through - But if the volume is not recreatable and its cluster is out of capacity, we will still fail to deploy the VM Conflicts: server/src/com/cloud/vm/VirtualMachineManagerImpl.java --- .../src/com/cloud/deploy/FirstFitPlanner.java | 2 + .../cloud/vm/VirtualMachineManagerImpl.java | 117 +++++++++--------- 2 files changed, 61 insertions(+), 58 deletions(-) diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java index c56b51a7bc8..113b56310ce 100755 --- a/server/src/com/cloud/deploy/FirstFitPlanner.java +++ b/server/src/com/cloud/deploy/FirstFitPlanner.java @@ -177,6 +177,8 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { HostVO host = _hostDao.findById(vm.getLastHostId()); if(host == null){ s_logger.debug("The last host of this VM cannot be found"); + }else if(avoid.shouldAvoid(host)){ + s_logger.debug("The last host of this VM is in avoid set"); }else{ if (host.getStatus() == Status.Up && host.getHostAllocationState() == Host.HostAllocationState.Enabled) { if(_capacityMgr.checkIfHostHasCapacity(host.getId(), cpu_requested, ram_requested, true, cpuOverprovisioningFactor)){ diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 12865a2282c..f54703c3b2a 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -129,7 +129,6 @@ import com.cloud.user.User; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.uservm.UserVm; -import com.cloud.utils.DateUtil; import com.cloud.utils.Journal; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; @@ -645,60 +644,59 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene + ", clusters: " + avoids.getClustersToAvoid() + ", hosts: " + avoids.getHostsToAvoid()); } - - // edit plan if this vm's ROOT volume is in READY state already - List vols = _volsDao.findReadyRootVolumesByInstance(vm.getId()); - boolean planChangedByVolume = false; - boolean rootVolumeisRecreatable = false; - DataCenterDeployment originalPlan = plan; - for (VolumeVO vol : vols) { - // make sure if the templateId is unchanged. If it is changed, let planner - // reassign pool for the volume even if it ready. - Long volTemplateId = vol.getTemplateId(); - if (volTemplateId != null && volTemplateId.longValue() != template.getId()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug(vol + " of " + vm + " is READY, but template ids don't match, let the planner reassign a new pool"); - } - continue; - } - StoragePoolVO pool = _storagePoolDao.findById(vol.getPoolId()); - if (!pool.isInMaintenance()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Root volume is ready, need to place VM in volume's cluster"); - } - long rootVolDcId = pool.getDataCenterId(); - Long rootVolPodId = pool.getPodId(); - Long rootVolClusterId = pool.getClusterId(); - if(planToDeploy != null && planToDeploy.getDataCenterId() != 0){ - Long clusterIdSpecified = planToDeploy.getClusterId(); - if(clusterIdSpecified != null && rootVolClusterId != null){ - if(rootVolClusterId.longValue() != clusterIdSpecified.longValue()){ - //cannot satisfy the plan passed in to the planner - if (s_logger.isDebugEnabled()) { - s_logger.debug("Cannot satisfy the deployment plan passed in since the ready Root volume is in different cluster. volume's cluster: "+rootVolClusterId + ", cluster specified: "+clusterIdSpecified); - } - throw new ResourceUnavailableException("Root volume is ready in different cluster, Deployment plan provided cannot be satisfied, unable to create a deployment for " + vm, Cluster.class, clusterIdSpecified); - } - } - plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId()); - }else{ - plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId()); - if (s_logger.isDebugEnabled()) { - s_logger.debug(vol + " is READY, changing deployment plan to use this pool's dcId: " + rootVolDcId + " , podId: " + rootVolPodId + " , and clusterId: " + rootVolClusterId); - } - planChangedByVolume = true; - if(vol.isRecreatable()){ - rootVolumeisRecreatable = true; - } - - } - } - } - + boolean planChangedByVolume = false; + boolean reuseVolume = true; + DataCenterDeployment originalPlan = plan; + int retry = _retry; while (retry-- != 0) { // It's != so that it can match -1. + if(reuseVolume){ + // edit plan if this vm's ROOT volume is in READY state already + List vols = _volsDao.findReadyRootVolumesByInstance(vm.getId()); + for (VolumeVO vol : vols) { + // make sure if the templateId is unchanged. If it is changed, let planner + // reassign pool for the volume even if it ready. + Long volTemplateId = vol.getTemplateId(); + if (volTemplateId != null && volTemplateId.longValue() != template.getId()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug(vol + " of " + vm + " is READY, but template ids don't match, let the planner reassign a new pool"); + } + continue; + } + + StoragePoolVO pool = _storagePoolDao.findById(vol.getPoolId()); + if (!pool.isInMaintenance()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Root volume is ready, need to place VM in volume's cluster"); + } + long rootVolDcId = pool.getDataCenterId(); + Long rootVolPodId = pool.getPodId(); + Long rootVolClusterId = pool.getClusterId(); + if(planToDeploy != null && planToDeploy.getDataCenterId() != 0){ + Long clusterIdSpecified = planToDeploy.getClusterId(); + if(clusterIdSpecified != null && rootVolClusterId != null){ + if(rootVolClusterId.longValue() != clusterIdSpecified.longValue()){ + //cannot satisfy the plan passed in to the planner + if (s_logger.isDebugEnabled()) { + s_logger.debug("Cannot satisfy the deployment plan passed in since the ready Root volume is in different cluster. volume's cluster: "+rootVolClusterId + ", cluster specified: "+clusterIdSpecified); + } + throw new ResourceUnavailableException("Root volume is ready in different cluster, Deployment plan provided cannot be satisfied, unable to create a deployment for " + vm, Cluster.class, clusterIdSpecified); + } + } + plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId()); + }else{ + plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug(vol + " is READY, changing deployment plan to use this pool's dcId: " + rootVolDcId + " , podId: " + rootVolPodId + " , and clusterId: " + rootVolClusterId); + } + planChangedByVolume = true; + } + } + } + } + VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, offering, account, params); DeployDestination dest = null; for (DeploymentPlanner planner : _planners) { @@ -715,12 +713,12 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene } if (dest == null) { - if(planChangedByVolume){ - if(rootVolumeisRecreatable){ - plan = originalPlan; - planChangedByVolume = false; - continue; - } + if (planChangedByVolume) { + plan = originalPlan; + planChangedByVolume = false; + //do not enter volume reuse for next retry, since we want to look for resorces outside the volume's cluster + reuseVolume = false; + continue; } throw new InsufficientServerCapacityException("Unable to create a deployment for " + vmProfile, DataCenter.class, plan.getDataCenterId()); } @@ -744,7 +742,10 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene if (vm.getHypervisorType() != HypervisorType.BareMetal) { _storageMgr.prepare(vmProfile, dest); } - + //since StorageMgr succeeded in volume creation, resue Volume for further tries until current cluster has capacity + if(!reuseVolume){ + reuseVolume = true; + } vmGuru.finalizeVirtualMachineProfile(vmProfile, dest, ctx); VirtualMachineTO vmTO = hvGuru.implement(vmProfile); From 2d19f3c29f84e6294dff03d709fabd877f0cd367 Mon Sep 17 00:00:00 2001 From: Jessica Tomechak Date: Thu, 16 Feb 2012 04:11:20 -0800 Subject: [PATCH 13/14] Update API Reference generator docs. --- setup/apidoc/generateadmincommands.xsl | 4 ++-- setup/apidoc/generatecommand.xsl | 2 +- setup/apidoc/generatedomainadmincommands.xsl | 4 ++-- setup/apidoc/generatetoc_header.xsl | 4 ++-- setup/apidoc/generateusercommands.xsl | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/setup/apidoc/generateadmincommands.xsl b/setup/apidoc/generateadmincommands.xsl index 7b566db123a..063d2848dbd 100644 --- a/setup/apidoc/generateadmincommands.xsl +++ b/setup/apidoc/generateadmincommands.xsl @@ -8,7 +8,7 @@ version="1.0"> -CloudStack | The Power Behind Your Cloud +CloudStack API Reference @@ -39,7 +39,7 @@ version="1.0"> - CloudStack v2.2.13 - 2.2.14 Root Admin API Reference + CloudStack 2.2.14 Root Admin API Reference

    diff --git a/setup/apidoc/generatecommand.xsl b/setup/apidoc/generatecommand.xsl index 5914e7db253..e50d8c73e62 100644 --- a/setup/apidoc/generatecommand.xsl +++ b/setup/apidoc/generatecommand.xsl @@ -8,7 +8,7 @@ version="1.0"> -CloudStack | The Power Behind Your Cloud +CloudStack API Reference diff --git a/setup/apidoc/generatedomainadmincommands.xsl b/setup/apidoc/generatedomainadmincommands.xsl index f500c0095a5..ca4fbdf772a 100644 --- a/setup/apidoc/generatedomainadmincommands.xsl +++ b/setup/apidoc/generatedomainadmincommands.xsl @@ -8,7 +8,7 @@ version="1.0"> -CloudStack | The Power Behind Your Cloud +CloudStack API Reference @@ -42,7 +42,7 @@ version="1.0"> - CloudStack v2.2.13 - 2.2.14 Domain Admin API Reference + CloudStack v2.2.14 Domain Admin API Reference

    diff --git a/setup/apidoc/generatetoc_header.xsl b/setup/apidoc/generatetoc_header.xsl index d8da9e9a8e3..e69e3be4b4e 100644 --- a/setup/apidoc/generatetoc_header.xsl +++ b/setup/apidoc/generatetoc_header.xsl @@ -8,7 +8,7 @@ version="1.0"> -CloudStack | The Power Behind Your Cloud +CloudStack API Reference @@ -34,7 +34,7 @@ version="1.0">
    -

    CloudStack API Documentation (v2.2.13 - 2.2.14)

    +

    CloudStack API Documentation (v2.2.14)

    Using the CloudStack API

    diff --git a/setup/apidoc/generateusercommands.xsl b/setup/apidoc/generateusercommands.xsl index fd6df5f2183..143803c743f 100644 --- a/setup/apidoc/generateusercommands.xsl +++ b/setup/apidoc/generateusercommands.xsl @@ -8,7 +8,7 @@ version="1.0"> -CloudStack | The Power Behind Your Cloud +CloudStack API Reference @@ -39,7 +39,7 @@ version="1.0"> - CloudStack v2.2.13 - 2.2.14 User API Reference + CloudStack v2.2.14 User API Reference

    From 0899dd56413e9e7d91744ddf1703cca099e49037 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 17 Feb 2012 14:50:10 -0800 Subject: [PATCH 14/14] bug 13777: propagate snapshot packaging failures up. Reviewed-By: Anthony tar command random failure may occur due to linux kernal bug (or feature) that tar can't handle well. The failuar happens when tar wants to package a newly created file before file system has fully synced --- .../vmware/mo/VirtualMachineMO.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index 382d1eb8cb0..227054169f8 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -1242,7 +1242,13 @@ public class VirtualMachineMO extends BaseMO { out.close(); // tar files into OVA - if(packToOva) { + if(packToOva) { + // Important! we need to sync file system before we can safely use tar to work around a linux kernal bug(or feature) + s_logger.info("Sync file system before we package OVA..."); + + Script commandSync = new Script(true, "sync", 0, s_logger); + commandSync.execute(); + Script command = new Script(false, "tar", 0, s_logger); command.setWorkDir(exportDir); command.add("-cf", exportName + ".ova"); @@ -1250,13 +1256,16 @@ public class VirtualMachineMO extends BaseMO { for(String name: fileNames) { command.add((new File(name).getName())); } - - String result = command.execute(); - if(result == null) { - success = true; + + s_logger.info("Package OVA with commmand: " + command.toString()); + command.execute(); + + // to be safe, physically test existence of the target OVA file + if((new File(exportDir + File.separator + exportName + ".ova")).exists()) { + success = true; } else { - s_logger.error("failed to execute command: " + command.toString()); - } + s_logger.error(exportDir + File.separator + exportName + ".ova is not created as expected"); + } } } } catch(Throwable e) { @@ -1270,10 +1279,8 @@ public class VirtualMachineMO extends BaseMO { } } - if(!success) { - new File(exportDir + File.separator + exportName + ".ova").delete(); + if(!success) throw new Exception("Unable to finish the whole process to package as a OVA file"); - } } } } finally {