Hello everyone, I am Frank Zhang, the architect of ZStack. Today I am happy to announce that ZStack v1.1 is released.

New Features And Enhancements

Installation And Upgrade

1. Ansible Optimization

In this version, we create customized deployers for all ZStack agents(i.e. kvmagent, backup storage agent) directly using Ansible SDK, instead of regular Ansible playbook YAML files. As the result, the speed of agent deployment gets significantly improved, because the deployer that is a Python application will try best to avoid unnecessary time-costing steps such as accessing YUM repo; the logging also gets better, each task will post messages to a logging URL before and after execution, and the error message will clearly state the error instead of flooding out all tasks status, which regular Ansible playbook YAML files normally do.

2. Console Proxy APIs

Two new APIs are added for console proxy, ReconnectConsoleProxyAgent and QueryConsoleProxyAgent.

Users can use ReconnectConsoleProxyAgent to redeploy console proxy agents:

        >>>ReconnectConsoleProxyAgent 

or use QueryConsoleProxyAgent to query agents' status:

       >>>QueryConsoleProxyAgent 

3. API Timeout Management

As ZStack consists of a lot of microservices which communicate with each other through async-messages, it's very hard to control API timeout because the API has no idea about internal messages entailed by itself. In this version, we add a central API timeout management framework that can connect an API to all entailed internal messages and HTTP requests, and that can propagate the API's timeout to the descendants. All APIs have default configurations, users can change a configuration by editing the zstack.properties file, for example:

    ApiTimeout.org.zstack.header.image.APIAddImageMsg= org.zstack.header.storage.backup.DownloadImageMsg, org.zstack.storage.backup.sftp.SftpBackupStorageCommands$DownloadCmd, org.zstack.storage.ceph.backup.CephBackupStorageBase$DownloadCmd; 6h

This example changes the timeout of API org.zstack.header.image.APIAddImageMsg to six hours. However, this way is discouraged. In 1.2 version, we will allow users to configure APIs' timeout through a new API.

4. Garbage Collector

In this version, the VM related garbage collectors are enabled. Users can destroy a VM anytime no matter the connection status of the host. For example, you can delete a VM even the network connection to the host where the VM is running is lost. The garbage collector will save user operations which cannot be completed in current situation and re-execute them once the host's network connection recovers. The garbage collector can be triggered by time-based poll and events, for example, a host reconnect event and host delete event can both trigger a VM deleting garbage collector.

5. 15M Tiny Tryout Image

A new 15 tiny image is ready for quickly try out creating VMs. The image supports runtime attaching/detaching volumes and networks. The ACPID daemon is also included so you can gracefully shutdown a VM. You can download the image from:

    http://download.zstack.org/templates/zstack-image-1.2.qcow2

6. New Virtual Router Image

The virtual router image is upgraded to 1.1 version, you can download it from:

    http://download.zstack.org/templates/zstack-virtualrouter-1.1.0.qcow2

NOTE: Users still using the old 0.9 version are not necessary to upgrade. However, we suggest all new users using the new version.

7. Installation

You can install the 1.1 release by:

    wget http://download.zstack.org/releases/1.1/1.1.0/0331/zstack-installer-1.1.0-0331.bin -O zstack-installer-1.1.0.bin
    bash zstack-installer-1.1.0.bin

8. Upgrade

To upgrade your ZStack to 1.1, do:

    wget http://download.zstack.org/releases/1.1/1.1.0/0331/zstack-installer-1.1.0-0331.bin -O zstack-installer-1.1.0.bin
    bash zstack-installer-1.1.0.bin -u

9. Upgrade Virtual Router Provider To Flat Network Provider

If you are currently using a flat network with a previous ZStack version, you can upgrade the L3 network using the flat network provider so you won't need the virtual router VM anymore. Assume the UUID of your L3 network is 1a82c2691978476fa6cefa36bb9d4bfd, please follow the below steps:

1. Obtain the UUID of the virtual rotuer provider

    >>>QueryNetworkServiceL3NetworkRef l3NetworkUuid=1a82c2691978476fa6cefa36bb9d4bfd
    {
        "inventories": [
            {
                "l3NetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                "networkServiceProviderUuid": "5d21ea0f39c04d6fb68cfaf5a37db4ad",
                "networkServiceType": "DNS"
            },
            {
                "l3NetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                "networkServiceProviderUuid": "5d21ea0f39c04d6fb68cfaf5a37db4ad",
                "networkServiceType": "DHCP"
            }
        ],
        "success": true
    }

2. Detach the virtual router provider from the L3 network

        >>>DetachNetworkServiceFromL3Network  l3NetworkUuid=1a82c2691978476fa6cefa36bb9d4bfd networkServices='{"5d21ea0f39c04d6fb68cfaf5a37db4ad":["DHCP","DNS"]}'
         {
             "inventory": {
                 "createDate": "Jan 30, 2016 3:01:03 PM",
                 "dns": [
                     "8.8.8.8"
                 ],
                 "ipRanges": [
                     {
                         "createDate": "Jan 30, 2016 3:01:04 PM",
                         "endIp": "192.168.201.199",
                         "gateway": "192.168.200.1",
                         "l3NetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                         "lastOpDate": "Jan 30, 2016 3:01:04 PM",
                         "name": "ipr-dk7p",
                         "netmask": "255.255.252.0",
                         "startIp": "192.168.201.180",
                         "uuid": "ec5fd87dd80243fdabeeace847c04427"
                     }
                 ],
                 "l2NetworkUuid": "9ec8cad681d1424fa7eda2447edae142",
                 "lastOpDate": "Jan 30, 2016 3:01:03 PM",
                 "name": "l3-etpz",
                 "networkServices": [],
                 "state": "Enabled",
                 "system": false,
                 "type": "L3BasicNetwork",
                 "uuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                 "zoneUuid": "4a3a78b1b9f049948b79cf9e667f0af2"
             },
             "success": true
         }

the parameter networkServices is a map where the key is a networkServiceProviderUuid and the value is a list of networkServiceType, which you obtain in the step 1

3. Get the flat network provider UUID

        >>>QueryNetworkServiceProvider type=Flat
        {
            "inventories": [
                {
                    "attachedL2NetworkUuids": [
                        "9ec8cad681d1424fa7eda2447edae142"
                    ],
                    "createDate": "Jan 30, 2016 11:56:32 AM",
                    "description": "Flat Network Service Provider",
                    "lastOpDate": "Jan 30, 2016 11:56:32 AM",
                    "name": "Flat Network Service Provider",
                    "networkServiceTypes": [
                        "DHCP",
                        "Userdata"
                    ],
                    "type": "Flat",
                    "uuid": "17864f985e584a9ba4cd81de215212ce"
                }
            ],
            "success": true
        }

4. Get L2 UUID for the L3 network

        >>>QueryL3Network fields=l2NetworkUuid, uuid=1a82c2691978476fa6cefa36bb9d4bfd
        {
            "inventories": [
                {
                    "l2NetworkUuid": "9ec8cad681d1424fa7eda2447edae142"
                }
            ],
            "success": true
        }

5. Attach the flat network provider to the L2 network

       >>>AttachNetworkServiceProviderToL2Network l2NetworkUuid=9ec8cad681d1424fa7eda2447edae142 networkServiceProviderUuid=17864f985e584a9ba4cd81de215212ce
       {
           "inventory": {
               "attachedL2NetworkUuids": [
                   "9ec8cad681d1424fa7eda2447edae142"
               ],
               "createDate": "Jan 30, 2016 11:56:32 AM",
               "description": "Flat Network Service Provider",
               "lastOpDate": "Jan 30, 2016 11:56:32 AM",
               "name": "Flat Network Service Provider",
               "networkServiceTypes": [
                   "DHCP",
                   "Userdata"
               ],
               "type": "Flat",
               "uuid": "17864f985e584a9ba4cd81de215212ce"
           },
           "success": true
       }

6. Attach the flat network provider to the L3 network

     >>>AttachNetworkServiceToL3Network l3NetworkUuid=1a82c2691978476fa6cefa36bb9d4bfd networkServices='{"17864f985e584a9ba4cd81de215212ce":["DHCP","Userdata"]}'
      {
          "inventory": {
              "createDate": "Jan 30, 2016 3:01:03 PM",
              "dns": [
                  "8.8.8.8"
              ],
              "ipRanges": [
                  {
                      "createDate": "Jan 30, 2016 3:01:04 PM",
                      "endIp": "192.168.201.199",
                      "gateway": "192.168.200.1",
                      "l3NetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                      "lastOpDate": "Jan 30, 2016 3:01:04 PM",
                      "name": "ipr-dk7p",
                      "netmask": "255.255.252.0",
                      "startIp": "192.168.201.180",
                      "uuid": "ec5fd87dd80243fdabeeace847c04427"
                  }
              ],
              "l2NetworkUuid": "9ec8cad681d1424fa7eda2447edae142",
              "lastOpDate": "Jan 30, 2016 3:01:03 PM",
              "name": "l3-etpz",
              "networkServices": [
                  {
                      "l3NetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                      "networkServiceProviderUuid": "17864f985e584a9ba4cd81de215212ce",
                      "networkServiceType": "DHCP"
                  },
                  {
                      "l3NetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                      "networkServiceProviderUuid": "17864f985e584a9ba4cd81de215212ce",
                      "networkServiceType": "Userdata"
                  }
              ],
              "state": "Enabled",
              "system": false,
              "type": "L3BasicNetwork",
              "uuid": "1a82c2691978476fa6cefa36bb9d4bfd",
              "zoneUuid": "4a3a78b1b9f049948b79cf9e667f0af2"
          },
          "success": true
      }

7. Delete the virtual router VM

        >>QueryVirtualRouterVm
         {
             "inventories": [
                 {
                     "allVolumes": [
                         {
                             "createDate": "Jan 30, 2016 3:06:50 PM",
                             "description": "Root volume for VM[uuid:c5a966cb87d644649952daf683f89e26]",
                             "deviceId": 0,
                             "format": "qcow2",
                             "installPath": "/zstack_ps/rootVolumes/acct-36c27e8ff05c4780bf6d2fa65700f22e/vol-8eeaa9cb4c1045a2825f8815fed69d72/8eeaa9cb4c1045a2825f8815fed69d72.qcow2",
                             "lastOpDate": "Jan 30, 2016 3:06:59 PM",
                             "name": "ROOT-for-virtualRouter.l3.1a82c2691978476fa6cefa36bb9d4bfd",
                             "primaryStorageUuid": "4bff4e2d266f480ead596752d14ff3b5",
                             "rootImageUuid": "7bed05aa8ace4e5e8d6c55b284b66fb5",
                             "size": 467206656,
                             "state": "Enabled",
                             "status": "Ready",
                             "type": "Root",
                             "uuid": "8eeaa9cb4c1045a2825f8815fed69d72",
                             "vmInstanceUuid": "c5a966cb87d644649952daf683f89e26"
                         }
                     ],
                     "allocatorStrategy": "LeastVmPreferredHostAllocatorStrategy",
                     "applianceVmType": "VirtualRouter",
                     "clusterUuid": "10409d3e33b249c19746022930a541c7",
                     "cpuNum": 1,
                     "cpuSpeed": 2,
                     "createDate": "Jan 30, 2016 3:06:50 PM",
                     "defaultRouteL3NetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                     "hostUuid": "415fa093b34e4a3d873368104b127115",
                     "hypervisorType": "KVM",
                     "imageUuid": "7bed05aa8ace4e5e8d6c55b284b66fb5",
                     "instanceOfferingUuid": "9cec7bd6324445a184351ffb7d32f970",
                     "lastHostUuid": "415fa093b34e4a3d873368104b127115",
                     "lastOpDate": "Jan 30, 2016 3:07:20 PM",
                     "managementNetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                     "memorySize": 536870912,
                     "name": "virtualRouter.l3.1a82c2691978476fa6cefa36bb9d4bfd",
                     "platform": "Linux",
                     "publicNetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                     "rootVolumeUuid": "8eeaa9cb4c1045a2825f8815fed69d72",
                     "state": "Running",
                     "status": "Connected",
                     "type": "ApplianceVm",
                     "uuid": "c5a966cb87d644649952daf683f89e26",
                     "vmNics": [
                         {
                             "createDate": "Jan 30, 2016 3:06:50 PM",
                             "deviceId": 0,
                             "gateway": "192.168.200.1",
                             "ip": "192.168.201.195",
                             "l3NetworkUuid": "1a82c2691978476fa6cefa36bb9d4bfd",
                             "lastOpDate": "Jan 30, 2016 3:06:50 PM",
                             "mac": "fa:4c:01:68:77:00",
                             "metaData": "7",
                             "netmask": "255.255.252.0",
                             "uuid": "c44e856aa88a42bc85ec30ce8c334c6c",
                             "vmInstanceUuid": "c5a966cb87d644649952daf683f89e26"
                         }
                     ],
                     "zoneUuid": "4a3a78b1b9f049948b79cf9e667f0af2"
                 }
             ],
             "success": true
         }

         >>>DestroyVmInstance uuid=c5a966cb87d644649952daf683f89e26
         {
             "success": true
         }

8. Reconnect all hosts

         >>>QueryHost
         {
             "inventories": [
                 {
                     "availableCpuCapacity": 7180,
                     "availableMemoryCapacity": 1997570048,
                     "clusterUuid": "4282fb61aa55458ea160de138e130298",
                     "createDate": "Jan 30, 2016 2:51:13 PM",
                     "hypervisorType": "KVM",
                     "lastOpDate": "Jan 30, 2016 3:03:20 PM",
                     "managementIp": "192.168.200.187",
                     "name": "host1",
                     "state": "Enabled",
                     "status": "Connected",
                     "totalCpuCapacity": 7182,
                     "totalMemoryCapacity": 2098233344,
                     "username": "root",
                     "uuid": "402f8304a50c410486e023512492316b",
                     "zoneUuid": "4a3a78b1b9f049948b79cf9e667f0af2"
                 },
                 {
                     "availableCpuCapacity": 14363,
                     "availableMemoryCapacity": 8321593344,
                     "clusterUuid": "10409d3e33b249c19746022930a541c7",
                     "createDate": "Jan 30, 2016 3:03:14 PM",
                     "hypervisorType": "KVM",
                     "lastOpDate": "Jan 30, 2016 3:03:52 PM",
                     "managementIp": "192.168.200.150",
                     "name": "host2",
                     "state": "Enabled",
                     "status": "Connected",
                     "totalCpuCapacity": 14364,
                     "totalMemoryCapacity": 8371924992,
                     "username": "root",
                     "uuid": "415fa093b34e4a3d873368104b127115",
                     "zoneUuid": "4a3a78b1b9f049948b79cf9e667f0af2"
                 }
             ],
             "success": true
         }

         >>>ReconnectHost uuid=402f8304a50c410486e023512492316b
         {
             "success": true
         }

         >>>ReconnectHost uuid=415fa093b34e4a3d873368104b127115
         {
             "success": true
         }