cloudstack-mirror/ui/scripts/zoneWizard.js
Alena Prokharchyk 2660a6b7a7 CLOUDSTACK-747: Internal LB between VPC tiers support
Squashed commit of the following:

commit def0861d5a
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu May 9 10:53:09 2013 -0700

    Inernallb: added internalLbVm to the list of network elements for nonoss build

commit 56d94fc074
Merge: d828c15 8f9a42e
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu May 9 09:51:36 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
    	server/src/com/cloud/network/vpc/VpcManagerImpl.java

commit d828c154fd
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed May 8 14:58:22 2013 -0700

    internallb: Fixed nonoss build

commit 1b8a6986a6
Merge: 9e74fa9 738d35a
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed May 8 13:20:07 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	api/src/com/cloud/async/AsyncJob.java
    	api/src/com/cloud/network/NetworkModel.java
    	api/src/com/cloud/network/rules/LoadBalancerContainer.java
    	api/src/org/apache/cloudstack/api/BaseCmd.java
    	api/src/org/apache/cloudstack/api/ResponseGenerator.java
    	api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java
    	client/tomcatconf/commands.properties.in
    	engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
    	server/src/com/cloud/api/ApiResponseHelper.java
    	server/src/com/cloud/network/NetworkManagerImpl.java
    	server/src/com/cloud/network/NetworkModelImpl.java
    	server/src/com/cloud/network/NetworkServiceImpl.java
    	server/src/com/cloud/server/ManagementServerImpl.java
    	server/test/com/cloud/network/MockNetworkModelImpl.java
    	server/test/com/cloud/vpc/MockNetworkManagerImpl.java
    	server/test/com/cloud/vpc/MockNetworkModelImpl.java
    	server/test/resources/appLoadBalancer.xml
    	setup/db/db/schema-410to420.sql
    	test/integration/component/test_multiple_ip_ranges.py
    	test/integration/smoke/test_guest_vlan_range.py
    	tools/marvin/marvin/integration/lib/base.py

commit 9e74fa9406
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Thu May 9 00:11:40 2013 +0530

    marvin changes for internallbvm provider

    - changed the simulator context to load the internallb bean
    - fixed deployDataCenter to use the additional provider by default
    - fixed the sandbox script and the setup script for simulator checkin
      tests

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 0a2d49301b
Author: Jessica Wang <jessicawang@apache.org>
Date:   Tue May 7 15:50:41 2013 -0700

    Internal LB - UI - zone wizard - advanced zone - enable internal LB element, enable internal LB provider.

commit 43e1667f90
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue May 7 13:26:53 2013 -0700

    Moved all DAOs and VOs to the cloud-engine-schema project

commit 2fd94c8bbe
Author: Radhika PC <radhika.puthiyetath@citrix.com>
Date:   Tue May 7 18:26:08 2013 +0530

    CLOUDSTACK-893 api

commit 12b64d6c00
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Tue May 7 17:06:15 2013 +0530

    Fixing the gmaven configuration for marvin/pom.xml

    For the marvin checkin test custom properties had a typo when run for
    the *nix environment.

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 1e4274dd9f
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Tue May 7 15:28:43 2013 +0530

    Renaming TesDedicateVlanRange -> TestDedicateVlanRange

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 9264ac526f
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Tue May 7 15:28:20 2013 +0530

    Adding isolation method to the zone creation of marvin

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 3a0dc67de0
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Tue May 7 15:27:26 2013 +0530

    adding ACL for dedicateGuestVlanRange set of APIs

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 79f6e11368
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Tue May 7 15:26:48 2013 +0530

    add debug logs when access checkers fail to find API

    When the access checkers fail for api discovery, we fail silently.
    instead record a debug message.

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 92cb7d3e0f
Author: Hugo Trippaers <trippie@gmail.com>
Date:   Tue May 7 11:44:23 2013 +0200

    commit e0d8f01ecd enabled all tests. Fix
    AWSAPI build by removing broken tests and excluding failing tests.

commit 4a391464c7
Author: Hugo Trippaers <htrippaers@schubergphilis.com>
Date:   Tue May 7 10:57:23 2013 +0200

    commit e0d8f01ecd enabled all tests, but the tests in vmware-base are horribly broken and will not compile with the current CloudStack.

    Removing the tests to fix the nonoss build and they are so broken they should be rewritten from scratch anyway.

commit 2ca03a8513
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Tue May 7 13:51:34 2013 +0530

    moving test data to top level dictionary

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit ceaa4e1b0d
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Tue May 7 13:50:56 2013 +0530

    Adding tracelogs to the API discovery service

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit a3f5f01c7e
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Tue May 7 13:50:12 2013 +0530

    dedicateGuestVlanRange is admin only API

    Adding ACL for the dedicateGuestVlanRange API.

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 1c4c80fe91
Author: Hugo Trippaers <htrippaers@schubergphilis.com>
Date:   Tue May 7 09:58:16 2013 +0200

    Recent pom switcharoo caused the client to lose the dependecy on console-proxy, which it needs to include the systemvm

commit 8103f3c386
Author: Radhika PC <radhika.puthiyetath@citrix.com>
Date:   Tue May 7 11:30:17 2013 +0530

    CLOUDSTACK-893 first cut

commit 67d0411d73
Author: Dave Cahill <dcahill@midokura.com>
Date:   Fri Apr 19 17:31:44 2013 +0900

    Add docs for MidoNet networking plugin [CLOUDSTACK-996]

    Signed-off-by: Dave Cahill <dcahill@midokura.com>

commit c745e6d28e
Author: Alex Huang <alex.huang@gmail.com>
Date:   Mon May 6 16:34:03 2013 -0700

    Fixed up the simulator to run with windows paths in cygwin

commit be91c03702
Author: Alex Huang <alex.huang@gmail.com>
Date:   Mon May 6 10:34:22 2013 -0700

    Moved over the VLAN daos

commit dcc09f8472
Author: Alex Huang <alex.huang@gmail.com>
Date:   Mon May 6 06:31:47 2013 -0700

    Missing file and updated .gitignore

commit e9953cd1a8
Author: Alex Huang <alex.huang@gmail.com>
Date:   Mon May 6 06:29:59 2013 -0700

    Fixed up unit testing to use only an in class TestConfiguration

commit 6727571403
Author: Alex Huang <alex.huang@gmail.com>
Date:   Thu May 2 15:20:49 2013 -0700

    Fixed an incorrect unit test for affinity group.  Removed some useless pom.xml.

commit d015fb3520
Author: Alex Huang <alex.huang@gmail.com>
Date:   Thu May 2 06:50:38 2013 -0700

    Moved most of the VOs and DAOs from server package into engine-schema as well

commit 77547a58df
Author: Alex Huang <alex.huang@gmail.com>
Date:   Wed May 1 15:15:57 2013 -0700

    Removed files that are no longer used and further separated out the files in the core project

commit 345f3d3482
Author: Alex Huang <alex.huang@gmail.com>
Date:   Wed May 1 05:46:15 2013 -0700

    Moved agent commands to core and out of api

commit e91ca00571
Author: Alex Huang <alex.huang@gmail.com>
Date:   Tue Apr 30 19:06:20 2013 -0700

    Removed framework-api which is completely useless.  Changed framework-ipc to reference gson itself.  Move VOs into engine-schema.

commit f64564e490
Author: Dennis Lawler <dlawler@gmail.com>
Date:   Mon Apr 29 15:10:09 2013 -0700

    Removing filterwin2k option

    Signed-off-by: Chiradeep Vittal <chiradeep@apache.org>

commit 944a7ea5d6
Author: Wei Zhou <w.zhou@leaseweb.com>
Date:   Mon May 6 20:57:02 2013 +0100

    CLOUDSTACK-2319: fix "unable to add egress rules" in SecurityGroup

    Signed-off-by: Chip Childers <chip.childers@gmail.com>

commit ff7f8ba362
Author: Wei Zhou <w.zhou@leaseweb.com>
Date:   Mon May 6 20:56:06 2013 +0100

    CLOUDSTACK-2322: update network.gateway to fix deployVm error on
    SharedNetwork after ipv6 support

    Signed-off-by: Chip Childers <chip.childers@gmail.com>

commit a153373c7e
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon May 6 11:45:19 2013 -0700

    CLOUDSTACK-129: added new API - listNetworkIsolationMethods - for displaying isolation methods supported by the cloudStack

commit 46f59cd49e
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Mon May 6 20:39:36 2013 +0530

    Fixed the incorrect assertion in noncontiguous_vlan test

    The assertion fails if the VLAN is found in which case find returns a
    positive number. So here the assertion should infact assert < 0 result.

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit bd1dcc10b3
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Mon May 6 19:53:42 2013 +0530

    Affinity Groups requires multiple storage pools

    Fixing the affinity group test which would fail to find the appropriate
    storage pool to satisfy the anti-affinity group of the second VM

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 7f853cdb8f
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Mon May 6 19:16:15 2013 +0530

    fixing double calls to VM deploy

    This fixes regression introduced in commit 2f40a90c that made duplicate
    calls to deployVirtualMachine.

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 646e810fcf
Author: Prasanna Santhanam <tsp@apache.org>
Date:   Mon May 6 18:51:53 2013 +0530

    fixing wildcard imports

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit b29b6e8525
Author: Hugo Trippaers <htrippaers@schubergphilis.com>
Date:   Fri May 3 14:03:53 2013 +0200

    BigSwitch should only respond if it is the actual provider on the network.

    This fixes an NPE during the release call.

commit 6fcc9b009b
Author: Hugo Trippaers <htrippaers@schubergphilis.com>
Date:   Thu May 2 17:38:27 2013 +0200

    Prevent Nicira NVP tags from exceeding the 40 character limit.

commit d8e61a1c0a
Author: Sanjay Tripathi <sanjay.tripathi@citrix.com>
Date:   Thu May 2 13:45:39 2013 +0530

    CLOUDSTACK-2188 : Parsing error with Download Monitor while checking the health of downloaded templates

    Signed-off-by: Sateesh Chodapuneedi <sateesh@apache.org>

commit 5b6e1140f9
Author: Sebastien Goasguen <runseb@gmail.com>
Date:   Mon May 6 05:35:58 2013 -0400

    CLOUDSTACK-2339: Adding libcloud example

commit 7be62d2374
Author: Sebastien Goasguen <runseb@gmail.com>
Date:   Mon May 6 05:35:19 2013 -0400

    CLOUDSTACK-2338: Adding example of how to sign api requests in python

commit 156fd68902
Author: Talluri <Srikanteswararao.Talluri@citrix.com>
Date:   Fri May 3 23:11:56 2013 +0530

    CLOUDSTACK-2323: fix test scripts to conform with library changes

    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 33ff5e9107
Author: sanjeevneelarapu <sanjeev.neelarapu@citrix.com>
Date:   Tue Apr 30 20:09:46 2013 +0530

    CLOUDSTACK-702: Tests for Multiple IP Ranges

    1.Deleting IP Range from the existing CIDR
    2.Add non-contiguous guest IP range in new CIDR
    3.Add overlapped guest IP range in existing CIDR

    Signed-off-by: sanjeevneelarapu <sanjeev.neelarapu@citrix.com>
    Signed-off-by: Prasanna Santhanam <tsp@apache.org>

commit 33059d1f66
Author: Pranav Saxena <pranav.saxena@citrix.com>
Date:   Mon May 6 14:08:40 2013 +0530

    scaleUp VM response change corresponding UI changes

commit 92e18d8106
Author: Pranav Saxena <pranav.saxena@citrix.com>
Date:   Mon May 6 13:45:32 2013 +0530

    CLOUDSTACK-2337:Resize button available for root/domain admin and normal users

commit d5cd3f7e00
Author: Likitha Shetty <likitha.shetty@citrix.com>
Date:   Wed May 1 13:47:26 2013 +0530

    Dedicate guest vlan range to account

commit 12c79c8377
Author: Pranav Saxena <pranav.saxena@citrix.com>
Date:   Sun May 5 12:02:32 2013 +0530

    scale up virtual machine response change in the backend

commit 94bac27622
Author: Rohit Yadav <bhaisaab@apache.org>
Date:   Sun May 5 09:58:04 2013 +0530

    appliance: Upgrade systemvm appliance from rc1 to Debian7 GA

    Signed-off-by: Rohit Yadav <bhaisaab@apache.org>

commit c598bb0038
Author: Isaac Chiang <isaacchiang@gmail.com>
Date:   Sun May 5 01:57:35 2013 +0530

    CLOUDSTACK-2076:Listview widget infinte scrolling error

commit d0615ea9a1
Author: Pranav Saxena <pranav.saxena@citrix.com>
Date:   Sun May 5 01:15:14 2013 +0530

    CLOUDSTACK-2274:Detail view loading problem when deleting a zone

commit 733b513c3a
Author: Isaac Chiang <isaacchiang@gmail.com>
Date:   Sat May 4 13:41:02 2013 +0530

    CLOUDSTACK-2160:Refresh button functionality for security groups and statistics tab

commit 418d75d7a4
Author: Marcus Sorensen <marcus@betterservers.com>
Date:   Fri May 3 14:09:52 2013 -0600

    Summary: Release old DHCP entries

    Detail: Refresh dnsmasq with updated entries live, no outage

    BUG-ID: CLOUDSTACK-2299
    Submitted-by: Dennis Lawler <dlawler@gmail.com>
    Signed-off-by: Marcus Sorensen <marcus@betterservers.com> 1367611792 -0600

commit b3dce64577
Author: Kelven Yang <kelveny@gmail.com>
Date:   Tue May 7 10:57:19 2013 -0700

    fix unitest

commit b17885f0f6
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue May 7 09:55:47 2013 -0700

    InternalLb: some fixes to the unittest

commit 1cff609347
Merge: 053e184 a3a5c13
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri May 3 11:23:08 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	server/src/com/cloud/network/NetworkModelImpl.java
    	server/src/com/cloud/network/NetworkServiceImpl.java
    	server/src/com/cloud/server/ManagementServerImpl.java
    	server/test/com/cloud/network/MockNetworkManagerImpl.java
    	server/test/com/cloud/vpc/MockNetworkManagerImpl.java

commit 053e18454d
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri May 3 11:07:07 2013 -0700

    InternalLB: marvin integration test for internal lb feature

commit 2e8e2f98f5
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed May 1 13:53:20 2013 -0700

    InternalLB: don't allow to upgrade the network from the network offering with internal LB to the offering with public LB, and vice versa

commit c773d204c8
Author: Chiradeep Vittal <chiradeep@apache.org>
Date:   Wed May 1 13:21:52 2013 -0700

    Internal LB: if we detect that we are inside an internal lb vm, call out to the ilb script to perform LB configuration

    Signed-off-by: Chiradeep Vittal <chiradeep@apache.org>

commit 8c8845bf77
Merge: 7e95545 471ca30
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed May 1 10:14:06 2013 -0700

    Merge branch 'master' into internallb1

commit 7e9554596f
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed May 1 10:01:16 2013 -0700

    InternalLb: boot args parameters cleanup for the internal lb vm

commit b7cf870074
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 30 10:31:28 2013 -0700

    InternalLb: more unittests for internal lb element

commit 63bb98ebe2
Author: Chiradeep Vittal <chiradeep@apache.org>
Date:   Mon Apr 29 18:29:25 2013 -0700

    allow ssh on eth1

    Signed-off-by: Chiradeep Vittal <chiradeep@apache.org>

commit ca1c313c29
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 29 17:58:45 2013 -0700

    InternalLb: DB upgrade - update existing physical networks with InternalLbVm provider

commit ed50caa01c
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 29 17:48:36 2013 -0700

    InternalLbVM: handle the scenario when sourceIpAddress is not passed when create internal Lb rule

commit 4c22c911a9
Author: Chiradeep Vittal <chiradeep@apache.org>
Date:   Mon Apr 29 15:56:00 2013 -0700

    backend support for Internal LB

    Signed-off-by: Chiradeep Vittal <chiradeep@apache.org>

commit 7b24a7640c
Merge: 440e848 a0dbf89
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 29 15:49:48 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	server/src/com/cloud/api/ApiResponseHelper.java
    	server/src/com/cloud/api/query/QueryManagerImpl.java
    	server/src/com/cloud/configuration/ConfigurationManagerImpl.java
    	server/src/com/cloud/network/NetworkManagerImpl.java
    	server/src/com/cloud/network/firewall/FirewallManagerImpl.java
    	setup/db/db/schema-410to420.sql

commit 440e8484d6
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 29 13:27:06 2013 -0700

    InternalLB: unittests for InternalLoadBalancerVMManager

commit 63babe4b7e
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 26 13:44:01 2013 -0700

    InternalLb:

    1) Added unittests for InternalLoadBalancerVMService
    2) Added unittests for InternalLoadBalancerElementService

commit 4f9c47ce54
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 25 14:46:42 2013 -0700

    InternalLb: create internal lb vm specific service offering

commit 408ee59d1f
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed Apr 24 17:08:08 2013 -0700

    Internallb: new set of Web services APIs for managing Internal LB VMs

commit 7680e1cc10
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed Apr 24 17:08:08 2013 -0700

    Internallb:

    1) InternalLb and PublicLb can't be enabled on the same network offering
    2) Can have internalLb only on VPC tier

commit d73ca7ef73
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed Apr 24 13:02:32 2013 -0700

    InternalLb:
    1) fixed the bug when the guest nic on internal lb vm wasnt set to be default
    2) Don't send the rules to the internal lb vm if its in Stopped state

commit ca2fc30655
Merge: 8057567 04a2b2d
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 23 16:56:11 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	server/src/com/cloud/network/vpc/VpcManagerImpl.java
    	server/src/com/cloud/server/ManagementServerImpl.java
    	setup/db/db/schema-410to420.sql

commit 8057567aaa
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 23 13:15:36 2013 -0700

    Internallb: more unittests for ApplicationLoadBalancerService

commit 35c0273b85
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 19 16:17:45 2013 -0700

    InternalLb: unittests for ApplicationLoadBalancerService

commit 69b23f7003
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 18 14:01:10 2013 -0700

    InternalLb: create/configure/listInternalLoadBalancerElement - fixes to the API response

commit a3321ce617
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 18 13:31:16 2013 -0700

    Internal LB : renamed the classes responsible for managing internal lb elements. Now the names are InternalLoadBalancerVMManager, InternalLoadBalancerVMService and InternalLoadBalancerVMManagerImpl

commit 2baf7c365c
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 18 10:02:17 2013 -0700

    Internallb: verify requested IP for LB rule (if specified) against guest network cidr

commit 0cfe96bd00
Merge: 501f2ff 11162f5
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed Apr 17 15:41:51 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	api/src/com/cloud/network/IpAddress.java
    	server/src/com/cloud/network/NetworkServiceImpl.java
    	setup/db/db/schema-410to420.sql

commit 501f2ffa0b
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 16 17:03:50 2013 -0700

    InternalLb: validate source ip network as a part of LB rule creation

commit 4d9a7dfd85
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 16 16:03:32 2013 -0700

    InternalLB: in VPC, restrict public LB to one tier only. Internal LB can be supported on multiple tiers

commit 8689bf9eb3
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 16 15:59:56 2013 -0700

    Internal LB: added internal lb vm to the list of supported providers in VPC default offering

commit b7709b89ff
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 16 11:04:22 2013 -0700

    Internal Lb: added 2 boolean fields - internal_lb and public_lb - to the network offering. Define if internal or public LB service is supported. In the current release it's either one or another; in the future releases we might support both on the same network

commit 014689e45e
Merge: b3b16ba 90e8158
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 16 09:55:45 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	api/src/com/cloud/network/Network.java
    	plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
    	server/src/com/cloud/network/NetworkManagerImpl.java
    	server/src/com/cloud/network/NetworkServiceImpl.java
    	server/test/com/cloud/network/MockNetworkManagerImpl.java
    	server/test/com/cloud/vpc/MockNetworkManagerImpl.java
    	setup/db/db/schema-410to420.sql

commit b3b16bae48
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 15 17:00:31 2013 -0700

    InternalLB: allow to specify more than one provider for the LB service when create network offering as diff providers can support internal and public LB for the same network

commit a4fc1d7d65
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 15 13:45:25 2013 -0700

    Internal LB:

    1) Added network_offering_details DB table and corresponding VO/DAO objects. Change createNetworkOffering web services api to accept the map of key/value pairs as details.
    2) Allow to have multiple providers for the same service for the network to support the case when LB service can have separate providers for Internal LB and Public LB

commit 4530cebf2b
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 15 10:06:10 2013 -0700

    InternalLbVm: support for start/stop Internal lb vm

commit ae69f0ae56
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 12 17:25:02 2013 -0700

    InternalLb: fixed prepare() in InternalLbElement - have to prepare nics of User vms only

commit 888a83c221
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 12 15:58:27 2013 -0700

    InternalLb: Start/deploy internal LB vms for the existing LB rules as a part of network implement

commit 3b41d5bee1
Merge: bb73531 4b1a9f1
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 12 15:32:40 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	server/src/com/cloud/network/NetworkModelImpl.java
    	server/src/com/cloud/server/ManagementServerImpl.java

commit bb73531fed
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 12 15:13:55 2013 -0700

    Internal Lb: list internal lb vms as a part of listRouters response. Introduced new parameter - role (can be virtual_router or internal_lb_vm)

commit c113ea184b
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 12 12:00:09 2013 -0700

    Add Internal Lb Provider/Element as a part of adding a physical network

commit 78c9db79da
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 12 10:05:28 2013 -0700

    InternalLbVm: destroy the internal lb vm when the last rule for the ip is being revoked

commit af6201257b
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 11 16:55:37 2013 -0700

    Internal LB: fixed some bugs in internal lb vm startup process

commit 1db240c2b6
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 11 14:23:55 2013 -0700

    InternalLb: fixed searchCriteria constructor in ApplicationLoadBalancerDaoImpl

commit 3795048fcc
Merge: f4c2b53 5f8a278
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 11 14:09:31 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	api/src/com/cloud/async/AsyncJob.java
    	api/src/org/apache/cloudstack/api/ApiConstants.java
    	api/src/org/apache/cloudstack/api/BaseCmd.java
    	api/src/org/apache/cloudstack/api/ResponseGenerator.java
    	client/tomcatconf/commands.properties.in
    	server/src/com/cloud/api/ApiDBUtils.java
    	server/src/com/cloud/api/ApiResponseHelper.java
    	server/src/com/cloud/server/ManagementServerImpl.java
    	setup/db/db/schema-410to420.sql

commit f4c2b53c21
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 11 13:46:47 2013 -0700

    InternalLB: modified InternalLbElement to start the Internal Lb vm for each ip address (if not already started)

commit 76a4b1cf81
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 11 11:41:47 2013 -0700

    InternalLB: added logic for acquiring guest ip address for the Internal LB rule

commit 915e39fbaa
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 11 10:19:18 2013 -0700

    Removed unused methods doing ipAllocation from GuestNetworkGuru and NetworkServiceImpl. The correct method is located in NetworkModelImpl

commit 3f2a62c7f6
Merge: 20beb7a a0b5ebc
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed Apr 10 17:16:07 2013 -0700

    Merge branch 'master' into internallb1

commit 20beb7a16c
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed Apr 10 15:28:12 2013 -0700

    Internal LB: applyLoadBalancerRules - put not null check for sourceIpAddressId (can be null when Schema is not Public)

commit 87e5f5b9a6
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Wed Apr 10 15:17:58 2013 -0700

    Internal LB: intermediate checkin - added InternalLBAppliance manager and managerImpl

commit 53b9c0d142
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 9 17:55:10 2013 -0700

    Internal LB: added @Since to API docs for Internal LB related commands

commit 867b305ea8
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 9 17:51:19 2013 -0700

    Internal LB: Made InternalLbElement to extend the ip deployer as the LB service implements IPDeployerRequester

commit 7b9af28094
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 9 15:45:30 2013 -0700

    InternalLb: new set of Web Services APIs to add InternalLB as a network element to the cloudStack (the element is packaged as an independent plugin). New APIs:

    1) configureInternalLoadBalancerElement
    2) createInternalLoadBalancerElement
    3) listInternalLoadBalancerElements

commit 039e303d4a
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 9 14:01:11 2013 -0700

    InternalLB: Modified pluggable service VirtualRouterElementService to accept only VirtualRouter and VpcVirtualRouter as a VirtualRouterProvider type when add/configure elements. Other VirtualRouterProviderTypes are are taken care by elb/internal lb plugins.

commit f0018b4512
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Tue Apr 9 12:56:42 2013 -0700

    Internal LB:

    1)Added InternalLoadBalancerManager and corresponding Impl
    2)Add InternalLbVm as a default CS provider. DB upgrade is covered as well

commit e344cf250a
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 8 16:57:47 2013 -0700

    InternalLB - removed unused code from LoadBalancerDao

commit 3588f46848
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 8 16:23:03 2013 -0700

    Internal LB - added network-element plugin for internal lb service

commit 76325e6168
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 8 13:58:08 2013 -0700

    Internal Lb:

    1) When network has both kinds of LB rules - Public and Internal - never send them in the same set to the provider
    2) Added extra checks on the provider side to validate if the schema - Public or Internal - is supported.

commit 56c2fe1d37
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 8 12:34:59 2013 -0700

    InternalLB:

    1) Added new capability for the LB service - LbSchemes. Can take 2 values - Internal and Public.
    2) F5 and Netscaler LB providers - changes all LB related methods to accept LoadBalancingRule instead of ? extends FirewallRule.

commit 34bcb2d026
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Mon Apr 8 12:11:11 2013 -0700

    InternalLB: implemented list/delete/create web services API commands that will be used for Internal LB creation

commit 9ab31e11f7
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Fri Apr 5 15:59:55 2013 -0700

    InternalLB: change LoadBalancingRule - reference sourceIpAddress of th load balancer by its value, not DB id

commit 08f855d4e4
Author: Alena Prokharchyk <alena.prokharchyk@citrix.com>
Date:   Thu Apr 4 09:26:21 2013 -0700

    InternalLB:

    1) Added new set of Interfaces - including the new VO - for the internal load balancer
    2) DB change - added source_ip_address/source_ip_address_network_id/scheme (Internal/Public) fields to the load_balancer table
2013-05-09 11:54:41 -07:00

3556 lines
159 KiB
JavaScript
Executable File

// 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.
(function(cloudStack, $) {
var selectedNetworkOfferingHavingSG = false;
var selectedNetworkOfferingHavingEIP = false;
var selectedNetworkOfferingHavingELB = false;
var selectedNetworkOfferingHavingNetscaler = false;
var returnedPublicVlanIpRanges = []; //public VlanIpRanges returned by API
var configurationUseLocalStorage = false;
var skipGuestTrafficStep = false;
var selectedNetworkOfferingObj = {};
var baremetalProviders = ["BaremetalDhcpProvider", "BaremetalPxeProvider", "BaremetaUserdataProvider"];
var selectedBaremetalProviders = [];
// Makes URL string for traffic label
var trafficLabelParam = function(trafficTypeID, data, physicalNetworkID) {
var zoneType = data.zone.networkType;
var hypervisor = data.zone.hypervisor;
physicalNetworkID = zoneType == 'Advanced' ? physicalNetworkID : 0;
var physicalNetwork = data.physicalNetworks ? data.physicalNetworks[physicalNetworkID] : null;
var trafficConfig = physicalNetwork ? physicalNetwork.trafficTypeConfiguration[trafficTypeID] : null;
var trafficLabel = trafficConfig ? trafficConfig.label : null;
var hypervisorAttr, trafficLabelStr;
switch(hypervisor) {
case 'XenServer':
hypervisorAttr = 'xennetworklabel';
break;
case 'KVM':
hypervisorAttr = 'kvmnetworklabel';
break;
case 'VMware':
hypervisorAttr = 'vmwarenetworklabel';
break;
case 'BareMetal':
hypervisorAttr = 'baremetalnetworklabel';
break;
case 'Ovm':
hypervisorAttr = 'ovmnetworklabel';
break;
case 'LXC':
hypervisorAttr = 'lxcnetworklabel';
break;
}
trafficLabelStr = trafficLabel ? '&' + hypervisorAttr + '=' + trafficLabel : '';
return trafficLabelStr;
};
cloudStack.zoneWizard = {
// Return required traffic types, for configure physical network screen
requiredTrafficTypes: function(args) {
if (args.data.zone.networkType == 'Basic') {
if(selectedNetworkOfferingHavingEIP || selectedNetworkOfferingHavingELB) {
return [
'management',
'guest',
'public'
];
}
else {
return [
'management',
'guest'
];
}
}
else { // args.data.zone.networkType == 'Advanced'
if(args.data.zone.sgEnabled != true) {
return [
'management',
'public',
'guest'
];
}
else {
return [
'management',
'guest'
];
}
}
},
disabledTrafficTypes: function(args) {
if (args.data.zone.networkType == 'Basic') {
if(selectedNetworkOfferingHavingEIP || selectedNetworkOfferingHavingELB)
return [];
else
return ['public'];
}
else { // args.data.zone.networkType == 'Advanced'
if(args.data.zone.sgEnabled != true) {
return [];
}
else {
return ['public'];
}
}
},
cloneTrafficTypes: function(args) {
if (args.data.zone.networkType == 'Advanced') {
return ['guest'];
} else {
return [];
}
},
customUI: {
publicTrafficIPRange: function(args) {
var multiEditData = [];
var totalIndex = 0;
return $('<div>').multiEdit({
context: args.context,
noSelect: true,
fields: {
'gateway': { edit: true, label: 'label.gateway' },
'netmask': { edit: true, label: 'label.netmask' },
'vlanid': { edit: true, label: 'label.vlan', isOptional: true },
'startip': { edit: true, label: 'label.start.IP' },
'endip': { edit: true, label: 'label.end.IP' },
'add-rule': { label: 'label.add', addButton: true }
},
add: {
label: 'label.add',
action: function(args) {
multiEditData.push($.extend(args.data, {
index: totalIndex
}));
totalIndex++;
args.response.success();
}
},
actions: {
destroy: {
label: 'label.remove.rule',
action: function(args) {
multiEditData = $.grep(multiEditData, function(item) {
return item.index != args.context.multiRule[0].index;
});
args.response.success();
}
}
},
dataProvider: function(args) {
args.response.success({
data: multiEditData
});
}
});
},
storageTrafficIPRange: function(args) {
var multiEditData = [];
var totalIndex = 0;
return $('<div>').multiEdit({
context: args.context,
noSelect: true,
fields: {
'gateway': { edit: true, label: 'label.gateway' },
'netmask': { edit: true, label: 'label.netmask' },
'vlan': { edit: true, label: 'label.vlan', isOptional: true },
'startip': { edit: true, label: 'label.start.IP' },
'endip': { edit: true, label: 'label.end.IP' },
'add-rule': { label: 'label.add', addButton: true }
},
add: {
label: 'label.add',
action: function(args) {
multiEditData.push($.extend(args.data, {
index: totalIndex
}));
totalIndex++;
args.response.success();
}
},
actions: {
destroy: {
label: 'label.remove.rule',
action: function(args) {
multiEditData = $.grep(multiEditData, function(item) {
return item.index != args.context.multiRule[0].index;
});
args.response.success();
}
}
},
dataProvider: function(args) {
args.response.success({
data: multiEditData
});
}
});
}
},
preFilters: {
addNetscalerDevice: function(args) { //add Netscaler
var isShown;
if(selectedNetworkOfferingHavingNetscaler == true) {
isShown = true;
$('.conditional.netscaler').show();
} else {
isShown= false;
$('.conditional.netscaler').hide();
}
return isShown;
},
addPublicNetwork: function(args) {
var isShown;
var $publicTrafficDesc = $('.zone-wizard:visible').find('#add_zone_public_traffic_desc');
if(args.data['network-model'] == 'Basic') {
if(selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true) {
isShown = true;
}
else {
isShown = false;
}
$publicTrafficDesc.find('#for_basic_zone').css('display', 'inline');
$publicTrafficDesc.find('#for_advanced_zone').hide();
}
else { //args.data['network-model'] == 'Advanced'
if(args.data["zone-advanced-sg-enabled"] != "on")
isShown = true;
else
isShown = false;
$publicTrafficDesc.find('#for_advanced_zone').css('display', 'inline');
$publicTrafficDesc.find('#for_basic_zone').hide();
}
return isShown;
},
setupPhysicalNetwork: function(args) {
if (args.data['network-model'] == 'Basic' &&
!(selectedNetworkOfferingHavingELB && selectedNetworkOfferingHavingEIP)) {
$('.setup-physical-network .info-desc.conditional.basic').show();
$('.setup-physical-network .info-desc.conditional.advanced').hide();
$('.subnav li.public-network').hide();
} else {
$('.setup-physical-network .info-desc.conditional.basic').hide();
$('.setup-physical-network .info-desc.conditional.advanced').show();
$('.subnav li.public-network').show();
}
return true; // Both basic & advanced zones show physical network UI
},
configureGuestTraffic: function(args) {
if ((args.data['network-model'] == 'Basic') || (args.data['network-model'] == 'Advanced' && args.data["zone-advanced-sg-enabled"] == "on")) {
$('.setup-guest-traffic').addClass('basic');
$('.setup-guest-traffic').removeClass('advanced');
skipGuestTrafficStep = false; //set value
}
else { //args.data['network-model'] == 'Advanced' && args.data["zone-advanced-sg-enabled"] != "on"
$('.setup-guest-traffic').removeClass('basic');
$('.setup-guest-traffic').addClass('advanced');
//skip the step if OVS tunnel manager is enabled
skipGuestTrafficStep = false; //reset it before ajax call
$.ajax({
url: createURL('listConfigurations'),
data: {
name: 'sdn.ovs.controller'
},
dataType: "json",
async: false,
success: function(json) {
var items = json.listconfigurationsresponse.configuration; //2 entries returned: 'sdn.ovs.controller', 'sdn.ovs.controller.default.label'
$(items).each(function(){
if(this.name == 'sdn.ovs.controller') {
if(this.value == 'true' || this.value == true) {
skipGuestTrafficStep = true;
}
return false; //break each loop
}
});
}
});
}
return !skipGuestTrafficStep;
},
configureStorageTraffic: function(args) {
return $.grep(args.groupedData.physicalNetworks, function(network) {
return $.inArray('storage', network.trafficTypes) > -1;
}).length;
},
addHost: function(args) {
return (args.groupedData.zone.hypervisor != "VMware");
},
addPrimaryStorage: function(args) {
return args.data.localstorageenabled != 'on';
}
},
forms: {
zone: {
preFilter: function(args) {
var $form = args.$form;
if (args.data['network-model'] == 'Basic') { //Basic zone
args.$form.find('[rel=networkOfferingId]').show();
args.$form.find('[rel=guestcidraddress]').hide();
args.$form.find('[rel=ip6dns1]').hide();
args.$form.find('[rel=ip6dns2]').hide();
}
else { //Advanced zone
args.$form.find('[rel=networkOfferingId]').hide();
if(args.data["zone-advanced-sg-enabled"] != "on") { //Advanced SG-disabled zone
args.$form.find('[rel=guestcidraddress]').show();
args.$form.find('[rel=ip6dns1]').show();
args.$form.find('[rel=ip6dns2]').show();
}
else { //Advanced SG-enabled zone
args.$form.find('[rel=guestcidraddress]').hide();
args.$form.find('[rel=ip6dns1]').hide();
args.$form.find('[rel=ip6dns2]').hide();
}
}
setTimeout(function() {
if ($form.find('input[name=ispublic]').is(':checked')) {
$form.find('[rel=domain]').hide();
}
});
},
fields: {
name: {
label: 'label.name', validation: { required: true },
desc: 'message.tooltip.zone.name'
},
ip4dns1: {
label: 'IPv4 DNS1', validation: { required: true },
desc: 'message.tooltip.dns.1'
},
ip4dns2: {
label: 'IPv4 DNS2',
desc: 'message.tooltip.dns.2'
},
ip6dns1: {
label: 'IPv6 DNS1',
desc: 'message.tooltip.dns.1'
},
ip6dns2: {
label: 'IPv6 DNS2',
desc: 'message.tooltip.dns.2'
},
internaldns1: {
label: 'label.internal.dns.1', validation: { required: true },
desc: 'message.tooltip.internal.dns.1'
},
internaldns2: {
label: 'label.internal.dns.2',
desc: 'message.tooltip.internal.dns.2'
},
hypervisor: {
label: 'label.hypervisor',
validation: { required: true },
select: function(args) {
$.ajax({
url: createURL('listHypervisors'),
async: false,
data: { listAll: true },
success: function(json) {
var items = json.listhypervisorsresponse.hypervisor;
var array1 = [];
var firstOption = "XenServer";
var nonSupportedHypervisors = {};
if(args.context.zones[0]['network-model'] == "Advanced" && args.context.zones[0]['zone-advanced-sg-enabled'] == "on") {
firstOption = "KVM";
nonSupportedHypervisors["XenServer"] = 1; //to developers: comment this line if you need to test Advanced SG-enabled zone with XenServer hypervisor
nonSupportedHypervisors["VMware"] = 1;
nonSupportedHypervisors["BareMetal"] = 1;
nonSupportedHypervisors["Ovm"] = 1;
nonSupportedHypervisors["LXC"] = 1;
}
if(items != null) {
for(var i = 0; i < items.length; i++) {
if(items[i].name in nonSupportedHypervisors)
continue;
if(items[i].name == firstOption)
array1.unshift({id: items[i].name, description: items[i].name});
else
array1.push({id: items[i].name, description: items[i].name});
}
}
args.response.success({
data: array1
});
}
});
}
},
networkOfferingId: {
label: 'label.network.offering',
dependsOn: 'hypervisor',
select: function(args) {
var selectedNetworkOfferingObj = {};
var networkOfferingObjs = [];
args.$select.unbind("change").bind("change", function(){
//reset when different network offering is selected
selectedNetworkOfferingHavingSG = false;
selectedNetworkOfferingHavingEIP = false;
selectedNetworkOfferingHavingELB = false;
selectedNetworkOfferingHavingNetscaler = false;
var selectedNetworkOfferingId = $(this).val();
$(networkOfferingObjs).each(function(){
if(this.id == selectedNetworkOfferingId) {
selectedNetworkOfferingObj = this;
return false; //break $.each() loop
}
});
if(selectedNetworkOfferingObj.havingNetscaler == true)
selectedNetworkOfferingHavingNetscaler = true;
if(selectedNetworkOfferingObj.havingSG == true)
selectedNetworkOfferingHavingSG = true;
if(selectedNetworkOfferingObj.havingEIP == true)
selectedNetworkOfferingHavingEIP = true;
if(selectedNetworkOfferingObj.havingELB == true)
selectedNetworkOfferingHavingELB = true;
});
$.ajax({
url: createURL("listNetworkOfferings&state=Enabled&guestiptype=Shared"),
dataType: "json",
async: false,
success: function(json) {
networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
var availableNetworkOfferingObjs = [];
$(networkOfferingObjs).each(function() {
var thisNetworkOffering = this;
$(this.service).each(function(){
var thisService = this;
$(thisService.provider).each(function(){
if(this.name == "Netscaler") {
thisNetworkOffering.havingNetscaler = true;
}
else if($.inArray(this.name, baremetalProviders) != -1) {
selectedBaremetalProviders.push(this.name);
}
});
if(thisService.name == "SecurityGroup") {
thisNetworkOffering.havingSG = true;
}
else if(thisService.name == "StaticNat") {
$(thisService.capability).each(function(){
if(this.name == "ElasticIp" && this.value == "true") {
thisNetworkOffering.havingEIP = true;
return false; //break $.each() loop
}
});
}
else if(thisService.name == "Lb") {
$(thisService.capability).each(function(){
if(this.name == "ElasticLb" && this.value == "true") {
thisNetworkOffering.havingELB = true;
return false; //break $.each() loop
}
});
}
});
if(thisNetworkOffering.havingEIP == true && thisNetworkOffering.havingELB == true) { //EIP ELB
if(args.hypervisor == "VMware" || args.hypervisor == "BareMetal") { //VMware, BareMetal don't support EIP ELB
return true; //move to next item in $.each() loop
}
if(args.context.zones[0]["network-model"] == "Advanced" && args.context.zones[0]["zone-advanced-sg-enabled"] == "on") { // Advanced SG-enabled zone doesn't support EIP ELB
return true; //move to next item in $.each() loop
}
}
if(args.context.zones[0]["network-model"] == "Advanced" && args.context.zones[0]["zone-advanced-sg-enabled"] == "on") { // Advanced SG-enabled zone
if(thisNetworkOffering.havingSG != true) {
return true; //move to next item in $.each() loop
}
}
availableNetworkOfferingObjs.push(thisNetworkOffering);
});
args.response.success({
data: $.map(availableNetworkOfferingObjs, function(offering) {
return {
id: offering.id,
description: offering.name
};
})
});
}
});
}
},
networkdomain: {
label: 'label.network.domain',
desc: 'message.tooltip.network.domain'
},
guestcidraddress: {
label: 'label.guest.cidr',
defaultValue: '10.1.1.0/24',
validation: { required: false }
},
ispublic: {
isReverse: true,
isBoolean: true,
label: 'label.public',
isChecked: true //checked by default (public zone)
},
domain: {
label: 'label.domain',
dependsOn: 'ispublic',
isHidden: true,
select: function(args) {
$.ajax({
url: createURL("listDomains&listAll=true"),
data: { viewAll: true },
dataType: "json",
async: false,
success: function(json) {
domainObjs = json.listdomainsresponse.domain;
args.response.success({
data: $.map(domainObjs, function(domain) {
return {
id: domain.id,
description: domain.path
};
})
});
}
});
}
},
localstorageenabled: {
label: 'label.local.storage.enabled',
isBoolean: true,
onChange: function(args) {
var $checkbox = args.$checkbox;
if ($checkbox.is(':checked')) {
cloudStack.dialog.confirm({
message: 'message.zoneWizard.enable.local.storage',
action: function() {
$checkbox.attr('checked', true);
},
cancelAction: function() {
$checkbox.attr('checked', false);
}
});
return false;
}
return true;
}
}
}
},
pod: {
fields: {
name: {
label: 'label.pod.name',
validation: { required: true },
desc: 'message.tooltip.pod.name'
},
reservedSystemGateway: {
label: 'label.reserved.system.gateway',
validation: { required: true },
desc: 'message.tooltip.reserved.system.gateway'
},
reservedSystemNetmask: {
label: 'label.reserved.system.netmask',
validation: { required: true },
desc: 'message.tooltip.reserved.system.netmask'
},
reservedSystemStartIp: {
label: 'label.start.reserved.system.IP',
validation: { required: true }
},
reservedSystemEndIp: {
label: 'label.end.reserved.system.IP',
validation: { required: false }
}
}
},
basicPhysicalNetwork: { //"Netscaler" now
preFilter: function(args) {
if (args.data['network-model'] == 'Basic' && (selectedNetworkOfferingHavingELB || selectedNetworkOfferingHavingEIP)) {
args.$form.find('[rel=dedicated]').hide();
} else {
args.$form.find('[rel=dedicated]').show();
};
cloudStack.preFilter.addLoadBalancerDevice
},
fields: {
ip: {
label: 'label.ip.address'
},
username: {
label: 'label.username'
},
password: {
label: 'label.password',
isPassword: true
},
networkdevicetype: {
label: 'label.type',
select: function(args) {
var items = [];
items.push({id: "NetscalerMPXLoadBalancer", description: "NetScaler MPX LoadBalancer"});
items.push({id: "NetscalerVPXLoadBalancer", description: "NetScaler VPX LoadBalancer"});
items.push({id: "NetscalerSDXLoadBalancer", description: "NetScaler SDX LoadBalancer"});
args.response.success({data: items});
}
},
publicinterface: {
label: 'label.public.interface'
},
privateinterface: {
label: 'label.private.interface'
},
gslbprovider: {
label: 'GSLB service',
isBoolean: true,
isChecked: true
},
gslbproviderpublicip: {
label: 'GSLB service Public IP'
},
gslbproviderprivateip: {
label: 'GSLB service Private IP'
},
numretries: {
label: 'label.numretries',
defaultValue: '2'
},
dedicated: {
label: 'label.dedicated',
isBoolean: true,
isChecked: false
},
capacity: {
label: 'label.capacity',
validation: { required: false, number: true }
}
}
},
guestTraffic: {
preFilter: function(args) {
var $guestTrafficDesc = $('.zone-wizard:visible').find('#add_zone_guest_traffic_desc');
if ((args.data['network-model'] == 'Basic') || (args.data['network-model'] == 'Advanced' && args.data["zone-advanced-sg-enabled"] == "on")) {
$guestTrafficDesc.find('#for_basic_zone').css('display', 'inline');
$guestTrafficDesc.find('#for_advanced_zone').hide();
}
else { //args.data['network-model'] == 'Advanced' && args.data["zone-advanced-sg-enabled"] != "on"
$guestTrafficDesc.find('#for_advanced_zone').css('display', 'inline');
$guestTrafficDesc.find('#for_basic_zone').hide();
}
var selectedZoneObj = {
networktype: args.data['network-model']
};
if (selectedZoneObj.networktype == 'Basic') {
args.$form.find('[rel="guestGateway"]').show();
args.$form.find('[rel="guestNetmask"]').show();
args.$form.find('[rel="guestStartIp"]').show();
args.$form.find('[rel="guestEndIp"]').show();
args.$form.find('[rel="vlanId"]').hide();
args.$form.find('[rel="vlanRange"]').hide();
}
else if(selectedZoneObj.networktype == 'Advanced' && args.data["zone-advanced-sg-enabled"] == "on") {
args.$form.find('[rel="guestGateway"]').show();
args.$form.find('[rel="guestNetmask"]').show();
args.$form.find('[rel="guestStartIp"]').show();
args.$form.find('[rel="guestEndIp"]').show();
args.$form.find('[rel="vlanId"]').show();
args.$form.find('[rel="vlanRange"]').hide();
}
else if (selectedZoneObj.networktype == 'Advanced' && args.data["zone-advanced-sg-enabled"] != "on") { //this conditional statement is useless because the div will be replaced with other div(multiple tabs in Advanced zone without SG) later
args.$form.find('[rel="guestGateway"]').hide();
args.$form.find('[rel="guestNetmask"]').hide();
args.$form.find('[rel="guestStartIp"]').hide();
args.$form.find('[rel="guestEndIp"]').hide();
args.$form.find('[rel="vlanId"]').hide();
args.$form.find('[rel="vlanRange"]').show();
}
},
fields: {
guestGateway: { label: 'label.guest.gateway' }, //Basic, Advanced with SG
guestNetmask: { label: 'label.guest.netmask' }, //Basic, Advanced with SG
guestStartIp: { label: 'label.guest.start.ip' }, //Basic, Advanced with SG
guestEndIp: { label: 'label.guest.end.ip' }, //Basic, Advanced with SG
vlanId: { label: 'VLAN ID' }, //Advanced with SG
vlanRange: { //in multiple tabs (tabs is as many as Guest Traffic types in multiple physical networks in Advanced Zone without SG)
label: 'label.vlan.range',
range: ['vlanRangeStart', 'vlanRangeEnd'],
validation: { required: false, digits: true } //Bug 13517 - AddZone wizard->Configure guest traffic: Vlan Range is optional
}
}
},
cluster: {
fields: {
hypervisor: {
label: 'label.hypervisor',
select: function(args) {
// Disable select -- selection is made on zone setup step
args.$select.attr('disabled', 'disabled');
$.ajax({
url: createURL("listHypervisors"),
dataType: "json",
async: false,
success: function(json) {
var hypervisors = json.listhypervisorsresponse.hypervisor;
var items = [];
$(hypervisors).each(function() {
items.push({id: this.name, description: this.name})
});
args.response.success({data: items});
args.$select.val(args.context.zones[0].hypervisor);
args.$select.change();
}
});
var vSwitchEnabled = false;
var dvSwitchEnabled = false;
// Check whether vSwitch capability is enabled
$.ajax({
url: createURL('listConfigurations'),
data: {
name: 'vmware.use.nexus.vswitch'
},
async: false,
success: function(json) {
if (json.listconfigurationsresponse.configuration[0].value == 'true') {
vSwitchEnabled = true;
}
}
});
//Check whether dvSwitch is enabled or not
$.ajax({
url: createURL('listConfigurations'),
data: {
name: 'vmware.use.dvswitch'
},
async: false,
success: function(json) { if (json.listconfigurationsresponse.configuration[0].value == 'true') { dvSwitchEnabled = true;
}
} });
args.$select.bind("change", function(event) {
var $form = $(this).closest('form');
var $vsmFields = $form.find('[rel]').filter(function() {
var vsmFields = [
'vsmipaddress',
'vsmusername',
'vsmpassword'
];
return $.inArray($(this).attr('rel'), vsmFields) > -1;
});
if($(this).val() == "VMware") {
//$('li[input_sub_group="external"]', $dialogAddCluster).show();
if(dvSwitchEnabled ){
/* $form.find('.form-item[rel=vSwitchPublicType]').css('display', 'inline-block');
$form.find('.form-item[rel=vSwitchGuestType]').css('display', 'inline-block');
$form.find('.form-item[rel=vSwitchPublicName]').css('display','inline-block');
$form.find('.form-item[rel=vSwitchGuestName]').css('display','inline-block');
$form.find('.form-item[rel=overridepublictraffic]').find('input[type=checkbox]').css('display','inline-block');
$form.find('.form-item[rel=overrideguesttraffic]').find('input[type=checkbox]').css('display','inline-block');*/
$form.find('.form-item[rel=overridepublictraffic]').css('display','inline-block');
$form.find('.form-item[rel=overridepublictraffic]').find('input[type=checkbox]').removeAttr('checked');
$form.find('.form-item[rel=overrideguesttraffic]').css('display','inline-block');
$form.find('.form-item[rel=overrideguesttraffic]').find('input[type=checkbox]').removeAttr('checked');
}
else {
/* $form.find('.form-item[rel=vSwitchPublicType]').css('display', 'none');
$form.find('.form-item[rel=vSwitchGuestType]').css('display', 'none');
$form.find('.form-item[rel=vSwitchPublicName]').css('display','none');
$form.find('.form-item[rel=vSwitchGuestName]').css('display','none');*/
$form.find('.form-item[rel=overridepublictraffic]').css('display','none');
$form.find('.form-item[rel=overrideguesttraffic]').css('display','none');
}
$form.find('[rel=vCenterHost]').css('display', 'block');
$form.find('[rel=vCenterUsername]').css('display', 'block');
$form.find('[rel=vCenterPassword]').css('display', 'block');
$form.find('[rel=vCenterDatacenter]').css('display', 'block');
if (vSwitchEnabled) {
$vsmFields.css('display', 'block');
} else {
$vsmFields.css('display', 'none');
}
//$("#cluster_name_label", $dialogAddCluster).text("vCenter Cluster:");
}
else {
//$('li[input_group="vmware"]', $dialogAddCluster).hide();
$form.find('.form-item[rel=overridepublictraffic]').css('display', 'none');
$form.find('.form-item[rel=overrideguesttraffic]').css('display', 'none');
$form.find('.form-item[rel=vSwitchPublicType]').css('display', 'none');
$form.find('.form-item[rel=vSwitchGuestType]').css('display', 'none');
$form.find('.form-item[rel=vSwitchPublicName]').css('display','none');
$form.find('.form-item[rel=vSwitchGuestName]').css('display','none');
$form.find('[rel=vCenterHost]').css('display', 'none');
$form.find('[rel=vCenterUsername]').css('display', 'none');
$form.find('[rel=vCenterPassword]').css('display', 'none');
$form.find('[rel=vCenterDatacenter]').css('display', 'none');
//$("#cluster_name_label", $dialogAddCluster).text("Cluster:");
}
});
}
},
name: {
label: 'label.cluster.name',
validation: { required: true }
},
//hypervisor==VMWare begins here
vCenterHost: {
label: 'label.vcenter.host',
validation: { required: true }
},
vCenterUsername: {
label: 'label.vcenter.username',
validation: { required: true }
},
vCenterPassword: {
label: 'label.vcenter.password',
validation: { required: true },
isPassword: true
},
vCenterDatacenter: {
label: 'label.vcenter.datacenter',
validation: { required: true }
},
overridepublictraffic:{
label:'Override Public-Traffic',
isBoolean:true,
isHidden:true
},
vSwitchPublicType:{
label: 'Public Traffic vSwitch Type',
select: function(args) {
var items = []
var vSwitchEnabled = false;
$.ajax({
url: createURL('listConfigurations'),
data: {
name: 'vmware.use.nexus.vswitch'
},
async: false,
success: function(json) {
if (json.listconfigurationsresponse.configuration[0].value == 'true') {
vSwitchEnabled = true;
}
}
});
if(vSwitchEnabled) {
items.push({ id:"nexusdvs" , description: "Cisco Nexus 1000v Distributed Virtual Switch"});
items.push({id: "vmwaresvs", description: "VMware vNetwork Standard Virtual Switch"});
items.push({id: "vmwaredvs", description: "VMware vNetwork Distributed Virtual Switch"});
}
// items.push({id: " ", description: " "});
else{
items.push({id:"vmwaredvs", description: "VMware vNetwork Distributed Virtual Switch"});
items.push({ id: "vmwaresvs", description: "VMware vNetwork Standard Virtual Switch"});
items.push({ id:"nexusdvs" , description: "Cisco Nexus 1000v Distributed Virtual Switch"});
}
args.response.success({data: items});
},
isHidden:true,
dependsOn:'overridepublictraffic'
},
vSwitchPublicName:{
label:'Public Traffic vSwitch Name',
dependsOn:'overridepublictraffic',
isHidden:true
},
overrideguesttraffic:{
label:'Override Guest-Traffic',
isBoolean:true,
isHidden:true
},
vSwitchGuestType:{
label: 'Guest Traffic vSwitch Type',
select: function(args) {
var items = []
//items.push({ id:" ", description:" "});
var vSwitchEnabled = false;
var items = []
$.ajax({
url: createURL('listConfigurations'),
data: {
name: 'vmware.use.nexus.vswitch'
},
async: false,
success: function(json) {
if (json.listconfigurationsresponse.configuration[0].value == 'true') {
vSwitchEnabled = true;
}
}
});
if(vSwitchEnabled) {
items.push({ id:"nexusdvs" , description: "Cisco Nexus 1000v Distributed Virtual Switch"});
items.push({id: "vmwaresvs", description: "VMware vNetwork Standard Virtual Switch"});
items.push({id: "vmwaredvs", description: "VMware vNetwork Distributed Virtual Switch"});
}
else{
items.push({id: "vmwaredvs", description: "VMware vNetwork Distributed Virtual Switch"});
items.push({id: "vmwaresvs", description: "VMware vNetwork Standard Virtual Switch"});
items.push({ id:"nexusdvs" , description: "Cisco Nexus 1000v Distributed Virtual Switch"});
}
args.response.success({data: items});
}, isHidden:true,
dependsOn:'overrideguesttraffic'
},
vSwitchGuestName:{
label:'Guest Traffic vSwitch Name',
dependsOn:'overrideguesttraffic',
isHidden:true
},
//Cisco Nexus Vswitch
vsmipaddress: {
label: 'Nexus 1000v IP Address',
validation: { required: true },
isHidden: true
},
vsmusername: {
label: 'Nexus 1000v Username',
validation: { required: true },
isHidden: true
},
vsmpassword: {
label: 'Nexus 1000v Password',
validation: { required: true },
isPassword: true,
isHidden: true
}
//hypervisor==VMWare ends here
}
},
host: {
preFilter: function(args) {
var selectedClusterObj = {
hypervisortype: args.data.hypervisor
};
var $form = args.$form;
if(selectedClusterObj.hypervisortype == "VMware") {
//$('li[input_group="general"]', $dialogAddHost).hide();
$form.find('[rel=hostname]').hide();
$form.find('[rel=username]').hide();
$form.find('[rel=password]').hide();
//$('li[input_group="vmware"]', $dialogAddHost).show();
$form.find('[rel=vcenterHost]').css('display', 'block');
//$('li[input_group="baremetal"]', $dialogAddHost).hide();
$form.find('[rel=baremetalCpuCores]').hide();
$form.find('[rel=baremetalCpu]').hide();
$form.find('[rel=baremetalMemory]').hide();
$form.find('[rel=baremetalMAC]').hide();
//$('li[input_group="Ovm"]', $dialogAddHost).hide();
$form.find('[rel=agentUsername]').hide();
$form.find('[rel=agentPassword]').hide();
}
else if (selectedClusterObj.hypervisortype == "BareMetal") {
//$('li[input_group="general"]', $dialogAddHost).show();
$form.find('[rel=hostname]').css('display', 'block');
$form.find('[rel=username]').css('display', 'block');
$form.find('[rel=password]').css('display', 'block');
//$('li[input_group="baremetal"]', $dialogAddHost).show();
$form.find('[rel=baremetalCpuCores]').css('display', 'block');
$form.find('[rel=baremetalCpu]').css('display', 'block');
$form.find('[rel=baremetalMemory]').css('display', 'block');
$form.find('[rel=baremetalMAC]').css('display', 'block');
//$('li[input_group="vmware"]', $dialogAddHost).hide();
$form.find('[rel=vcenterHost]').hide();
//$('li[input_group="Ovm"]', $dialogAddHost).hide();
$form.find('[rel=agentUsername]').hide();
$form.find('[rel=agentPassword]').hide();
}
else if (selectedClusterObj.hypervisortype == "Ovm") {
//$('li[input_group="general"]', $dialogAddHost).show();
$form.find('[rel=hostname]').css('display', 'block');
$form.find('[rel=username]').css('display', 'block');
$form.find('[rel=password]').css('display', 'block');
//$('li[input_group="vmware"]', $dialogAddHost).hide();
$form.find('[rel=vcenterHost]').hide();
//$('li[input_group="baremetal"]', $dialogAddHost).hide();
$form.find('[rel=baremetalCpuCores]').hide();
$form.find('[rel=baremetalCpu]').hide();
$form.find('[rel=baremetalMemory]').hide();
$form.find('[rel=baremetalMAC]').hide();
//$('li[input_group="Ovm"]', $dialogAddHost).show();
$form.find('[rel=agentUsername]').css('display', 'block');
$form.find('[rel=agentUsername]').find('input').val("oracle");
$form.find('[rel=agentPassword]').css('display', 'block');
}
else {
//$('li[input_group="general"]', $dialogAddHost).show();
$form.find('[rel=hostname]').css('display', 'block');
$form.find('[rel=username]').css('display', 'block');
$form.find('[rel=password]').css('display', 'block');
//$('li[input_group="vmware"]', $dialogAddHost).hide();
$form.find('[rel=vcenterHost]').hide();
//$('li[input_group="baremetal"]', $dialogAddHost).hide();
$form.find('[rel=baremetalCpuCores]').hide();
$form.find('[rel=baremetalCpu]').hide();
$form.find('[rel=baremetalMemory]').hide();
$form.find('[rel=baremetalMAC]').hide();
//$('li[input_group="Ovm"]', $dialogAddHost).hide();
$form.find('[rel=agentUsername]').hide();
$form.find('[rel=agentPassword]').hide();
}
},
fields: {
hostname: {
label: 'label.host.name',
validation: { required: true },
isHidden: true
},
username: {
label: 'label.username',
validation: { required: true },
isHidden: true
},
password: {
label: 'label.password',
validation: { required: true },
isHidden: true,
isPassword: true
},
//input_group="general" ends here
//input_group="VMWare" starts here
vcenterHost: {
label: 'label.esx.host',
validation: { required: true },
isHidden: true
},
//input_group="VMWare" ends here
//input_group="BareMetal" starts here
baremetalCpuCores: {
label: 'label.num.cpu.cores',
validation: { required: true },
isHidden: true
},
baremetalCpu: {
label: 'label.cpu.mhz',
validation: { required: true },
isHidden: true
},
baremetalMemory: {
label: 'label.memory.mb',
validation: { required: true },
isHidden: true
},
baremetalMAC: {
label: 'label.host.MAC',
validation: { required: true },
isHidden: true
},
//input_group="BareMetal" ends here
//input_group="OVM" starts here
agentUsername: {
label: 'label.agent.username',
validation: { required: false },
isHidden: true
},
agentPassword: {
label: 'label.agent.password',
validation: { required: true },
isHidden: true,
isPassword: true
},
//input_group="OVM" ends here
//always appear (begin)
hosttags: {
label: 'label.host.tags',
validation: { required: false }
}
//always appear (end)
}
},
primaryStorage: {
preFilter: function(args) {},
fields: {
name: {
label: 'label.name',
validation: { required: true }
},
scope: {
label: 'label.scope',
select: function(args) {
var selectedHypervisorObj = {
hypervisortype: $.isArray(args.context.zones[0].hypervisor) ?
// We want the cluster's hypervisor type
args.context.zones[0].hypervisor[1] : args.context.zones[0].hypervisor
};
if(selectedHypervisorObj == null) {
return;
}
// ZWPS is supported only for KVM as the hypervisor
if(selectedHypervisorObj.hypervisortype != "KVM"){
var scope=[];
scope.push({ id: 'cluster', description: _l('label.cluster') });
//scope.push({ id: 'host', description: _l('label.host') });
args.response.success({data: scope});
}
else {
var scope=[];
scope.push({ id: 'zone', description: _l('label.zone.wide') });
scope.push({ id: 'cluster', description: _l('label.cluster') });
// scope.push({ id: 'host', description: _l('label.host') });
args.response.success({data: scope});
}
}
},
protocol: {
label: 'label.protocol',
validation: { required: true },
select: function(args) {
var selectedClusterObj = {
hypervisortype: $.isArray(args.context.zones[0].hypervisor) ?
// We want the cluster's hypervisor type
args.context.zones[0].hypervisor[1] : args.context.zones[0].hypervisor
};
if(selectedClusterObj == null) {
return;
}
if(selectedClusterObj.hypervisortype == "KVM") {
var items = [];
items.push({id: "nfs", description: "nfs"});
items.push({id: "SharedMountPoint", description: "SharedMountPoint"});
items.push({id: "clvm", description: "CLVM"});
args.response.success({data: items});
}
else if(selectedClusterObj.hypervisortype == "XenServer") {
var items = [];
items.push({id: "nfs", description: "nfs"});
items.push({id: "PreSetup", description: "PreSetup"});
items.push({id: "iscsi", description: "iscsi"});
args.response.success({data: items});
}
else if(selectedClusterObj.hypervisortype == "VMware") {
var items = [];
items.push({id: "nfs", description: "nfs"});
items.push({id: "vmfs", description: "vmfs"});
args.response.success({data: items});
}
else if(selectedClusterObj.hypervisortype == "Ovm") {
var items = [];
items.push({id: "nfs", description: "nfs"});
items.push({id: "ocfs2", description: "ocfs2"});
args.response.success({data: items});
}
else if(selectedClusterObj.hypervisortype == "LXC") {
var items = [];
items.push({id: "nfs", description: "nfs"});
items.push({id: "SharedMountPoint", description: "SharedMountPoint"});
args.response.success({data: items});
}
else {
args.response.success({data:[]});
}
args.$select.change(function() {
var $form = $(this).closest('form');
var protocol = $(this).val();
$form.find('[rel=path]').find(".name").find("label").html('<span class=\"field-required\">*</span>Path:');
if(protocol == null)
return;
if(protocol == "nfs") {
//$("#add_pool_server_container", $dialogAddPool).show();
$form.find('[rel=server]').css('display', 'block');
//$dialogAddPool.find("#add_pool_nfs_server").val("");
$form.find('[rel=server]').find(".value").find("input").val("");
//$('li[input_group="nfs"]', $dialogAddPool).show();
$form.find('[rel=path]').css('display', 'block');
//$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.path"]+":");
//$form.find('[rel=path]').find(".name").find("label").text("Path:");
//$('li[input_group="iscsi"]', $dialogAddPool).hide();
$form.find('[rel=iqn]').hide();
$form.find('[rel=lun]').hide();
//$('li[input_group="clvm"]', $dialogAddPool).hide();
$form.find('[rel=volumegroup]').hide();
//$('li[input_group="vmfs"]', $dialogAddPool).hide();
$form.find('[rel=vCenterDataCenter]').hide();
$form.find('[rel=vCenterDataStore]').hide();
}
else if(protocol == "ocfs2") {//ocfs2 is the same as nfs, except no server field.
//$dialogAddPool.find("#add_pool_server_container").hide();
$form.find('[rel=server]').hide();
//$dialogAddPool.find("#add_pool_nfs_server").val("");
$form.find('[rel=server]').find(".value").find("input").val("");
//$('li[input_group="nfs"]', $dialogAddPool).show();
$form.find('[rel=path]').css('display', 'block');
//$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.path"]+":");
//$form.find('[rel=path]').find(".name").find("label").text("Path:");
//$('li[input_group="iscsi"]', $dialogAddPool).hide();
$form.find('[rel=iqn]').hide();
$form.find('[rel=lun]').hide();
//$('li[input_group="clvm"]', $dialogAddPool).hide();
$form.find('[rel=volumegroup]').hide();
//$('li[input_group="vmfs"]', $dialogAddPool).hide();
$form.find('[rel=vCenterDataCenter]').hide();
$form.find('[rel=vCenterDataStore]').hide();
}
else if(protocol == "PreSetup") {
//$dialogAddPool.find("#add_pool_server_container").hide();
$form.find('[rel=server]').hide();
//$dialogAddPool.find("#add_pool_nfs_server").val("localhost");
$form.find('[rel=server]').find(".value").find("input").val("localhost");
//$('li[input_group="nfs"]', $dialogAddPool).show();
$form.find('[rel=path]').css('display', 'block');
//$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.SR.name"]+":");
$form.find('[rel=path]').find(".name").find("label").html("<span class=\"field-required\">*</span>SR Name-Label:");
//$('li[input_group="iscsi"]', $dialogAddPool).hide();
$form.find('[rel=iqn]').hide();
$form.find('[rel=lun]').hide();
//$('li[input_group="clvm"]', $dialogAddPool).hide();
$form.find('[rel=volumegroup]').hide();
//$('li[input_group="vmfs"]', $dialogAddPool).hide();
$form.find('[rel=vCenterDataCenter]').hide();
$form.find('[rel=vCenterDataStore]').hide();
}
else if(protocol == "iscsi") {
//$dialogAddPool.find("#add_pool_server_container").show();
$form.find('[rel=server]').css('display', 'block');
//$dialogAddPool.find("#add_pool_nfs_server").val("");
$form.find('[rel=server]').find(".value").find("input").val("");
//$('li[input_group="nfs"]', $dialogAddPool).hide();
$form.find('[rel=path]').hide();
//$('li[input_group="iscsi"]', $dialogAddPool).show();
$form.find('[rel=iqn]').css('display', 'block');
$form.find('[rel=lun]').css('display', 'block');
//$('li[input_group="clvm"]', $dialogAddPool).hide();
$form.find('[rel=volumegroup]').hide();
//$('li[input_group="vmfs"]', $dialogAddPool).hide();
$form.find('[rel=vCenterDataCenter]').hide();
$form.find('[rel=vCenterDataStore]').hide();
}
else if($(this).val() == "clvm") {
//$("#add_pool_server_container", $dialogAddPool).hide();
$form.find('[rel=server]').hide();
//$dialogAddPool.find("#add_pool_nfs_server").val("localhost");
$form.find('[rel=server]').find(".value").find("input").val("localhost");
//$('li[input_group="nfs"]', $dialogAddPool).hide();
$form.find('[rel=path]').hide();
//$('li[input_group="iscsi"]', $dialogAddPool).hide();
$form.find('[rel=iqn]').hide();
$form.find('[rel=lun]').hide();
//$('li[input_group="clvm"]', $dialogAddPool).show();
$form.find('[rel=volumegroup]').css('display', 'inline-block');
//$('li[input_group="vmfs"]', $dialogAddPool).hide();
$form.find('[rel=vCenterDataCenter]').hide();
$form.find('[rel=vCenterDataStore]').hide();
}
else if(protocol == "vmfs") {
//$dialogAddPool.find("#add_pool_server_container").show();
$form.find('[rel=server]').css('display', 'block');
//$dialogAddPool.find("#add_pool_nfs_server").val("");
$form.find('[rel=server]').find(".value").find("input").val("");
//$('li[input_group="nfs"]', $dialogAddPool).hide();
$form.find('[rel=path]').hide();
//$('li[input_group="iscsi"]', $dialogAddPool).hide();
$form.find('[rel=iqn]').hide();
$form.find('[rel=lun]').hide();
//$('li[input_group="clvm"]', $dialogAddPool).hide();
$form.find('[rel=volumegroup]').hide();
//$('li[input_group="vmfs"]', $dialogAddPool).show();
$form.find('[rel=vCenterDataCenter]').css('display', 'block');
$form.find('[rel=vCenterDataStore]').css('display', 'block');
}
else if(protocol == "SharedMountPoint") { //"SharedMountPoint" show the same fields as "nfs" does.
//$dialogAddPool.find("#add_pool_server_container").hide();
$form.find('[rel=server]').hide();
//$dialogAddPool.find("#add_pool_nfs_server").val("localhost");
$form.find('[rel=server]').find(".value").find("input").val("localhost");
//$('li[input_group="nfs"]', $dialogAddPool).show();
$form.find('[rel=path]').css('display', 'block');
//$form.find('[rel=path]').find(".name").find("label").text("Path:");
//$('li[input_group="iscsi"]', $dialogAddPool).hide();
$form.find('[rel=iqn]').hide();
$form.find('[rel=lun]').hide();
//$('li[input_group="clvm"]', $dialogAddPool).hide();
$form.find('[rel=volumegroup]').hide();
//$('li[input_group="vmfs"]', $dialogAddPool).hide();
$form.find('[rel=vCenterDataCenter]').hide();
$form.find('[rel=vCenterDataStore]').hide();
}
else {
//$dialogAddPool.find("#add_pool_server_container").show();
$form.find('[rel=server]').css('display', 'block');
//$dialogAddPool.find("#add_pool_nfs_server").val("");
$form.find('[rel=server]').find(".value").find("input").val("");
//$('li[input_group="iscsi"]', $dialogAddPool).hide();
$form.find('[rel=iqn]').hide();
$form.find('[rel=lun]').hide();
//$('li[input_group="clvm"]', $dialogAddPool).hide();
$form.find('[rel=volumegroup]').hide();
//$('li[input_group="vmfs"]', $dialogAddPool).hide();
$form.find('[rel=vCenterDataCenter]').hide();
$form.find('[rel=vCenterDataStore]').hide();
}
});
args.$select.trigger("change");
}
},
server: {
label: 'label.server',
validation: { required: true },
isHidden: true
},
//nfs
path: {
label: 'label.path',
validation: { required: true },
isHidden: true
},
//iscsi
iqn: {
label: 'label.target.iqn',
validation: { required: true },
isHidden: true
},
lun: {
label: 'label.LUN.number',
validation: { required: true },
isHidden: true
},
//clvm
volumegroup: {
label: 'label.volgroup',
validation: { required: true },
isHidden: true
},
//vmfs
vCenterDataCenter: {
label: 'label.vcenter.datacenter',
validation: { required: true },
isHidden: true
},
vCenterDataStore: {
label: 'label.vcenter.datastore',
validation: { required: true },
isHidden: true
},
//always appear (begin)
storageTags: {
label: 'label.storage.tags',
validation: { required: false }
}
//always appear (end)
}
},
secondaryStorage: {
fields: {
nfsServer: {
label: 'label.nfs.server',
validation: { required: true }
},
path: {
label: 'label.path',
validation: { required: true }
}
}
}
},
action: function(args) {
var advZoneConfiguredVirtualRouterCount = 0; //for multiple physical networks in advanced zone. Each physical network has 2 virtual routers: regular one and VPC one.
var success = args.response.success;
var error = args.response.error;
var message = args.response.message;
//var data = args.data;
var startFn = args.startFn;
var data = args.data;
var stepFns = {
addZone: function() {
message(dictionary['message.creating.zone']);
var array1 = [];
var networkType = args.data.zone.networkType; //"Basic", "Advanced"
array1.push("&networktype=" + todb(networkType));
if(networkType == "Advanced") {
if(args.data.zone.sgEnabled != true) {
array1.push("&securitygroupenabled=false");
if(args.data.zone.guestcidraddress != null && args.data.zone.guestcidraddress.length > 0)
array1.push("&guestcidraddress=" + todb(args.data.zone.guestcidraddress));
}
else { // args.data.zone.sgEnabled == true
array1.push("&securitygroupenabled=true");
}
}
array1.push("&name=" + todb(args.data.zone.name));
if (args.data.zone.localstorageenabled == 'on') {
array1.push("&localstorageenabled=true");
}
//IPv4
if (args.data.zone.ip4dns1 != null && args.data.zone.ip4dns1.length > 0)
array1.push("&dns1=" + todb(args.data.zone.ip4dns1));
if (args.data.zone.ip4dns2 != null && args.data.zone.ip4dns2.length > 0)
array1.push("&dns2=" + todb(args.data.zone.ip4dns2));
//IPv6
if (args.data.zone.ip6dns1 != null && args.data.zone.ip6dns1.length > 0)
array1.push("&ip6dns1=" + todb(args.data.zone.ip6dns1));
if (args.data.zone.ip6dns2 != null && args.data.zone.ip6dns2.length > 0)
array1.push("&ip6dns2=" + todb(args.data.zone.ip6dns2));
array1.push("&internaldns1="+todb(args.data.zone.internaldns1));
var internaldns2 = args.data.zone.internaldns2;
if (internaldns2 != null && internaldns2.length > 0)
array1.push("&internaldns2=" + todb(internaldns2));
if(args.data.pluginFrom == null) { //from zone wizard, not from quick instsaller(args.data.pluginFrom != null && args.data.pluginFrom.name == 'installWizard') who doesn't have public checkbox
if(args.data.zone.ispublic == null) //public checkbox in zone wizard is unchecked
array1.push("&domainid=" + args.data.zone.domain);
}
if(args.data.zone.networkdomain != null && args.data.zone.networkdomain.length > 0)
array1.push("&domain=" + todb(args.data.zone.networkdomain));
$.ajax({
url: createURL("createZone" + array1.join("")),
dataType: "json",
async: false,
success: function(json) {
stepFns.addPhysicalNetworks({
data: $.extend(args.data, {
returnedZone: json.createzoneresponse.zone
})
});
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('addZone', errorMsg, { fn: 'addZone', args: args });
}
});
},
addPhysicalNetworks: function(args) {
message(dictionary['message.creating.physical.networks']);
var returnedPhysicalNetworks = [];
if(args.data.zone.networkType == "Basic") { //Basic zone ***
var requestedTrafficTypeCount = 2; //request guest traffic type, management traffic type
if(selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true)
requestedTrafficTypeCount++; //request public traffic type
//Basic zone has only one physical network
var array1 = [];
if("physicalNetworks" in args.data) { //from add-zone-wizard
array1.push("&name=" + todb(args.data.physicalNetworks[0].name));
}
else { //from quick-install-wizard
array1.push("&name=PhysicalNetworkInBasicZone");
}
$.ajax({
url: createURL("createPhysicalNetwork&zoneid=" + args.data.returnedZone.id + array1.join("")),
dataType: "json",
success: function(json) {
var jobId = json.createphysicalnetworkresponse.jobid;
var createPhysicalNetworkIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(createPhysicalNetworkIntervalID);
if (result.jobstatus == 1) {
var returnedBasicPhysicalNetwork = result.jobresult.physicalnetwork;
var label = returnedBasicPhysicalNetwork.id + trafficLabelParam('guest', data);
var returnedTrafficTypes = [];
$.ajax({
url: createURL("addTrafficType&trafficType=Guest&physicalnetworkid=" + label),
dataType: "json",
success: function(json) {
var jobId = json.addtraffictyperesponse.jobid;
var addGuestTrafficTypeIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(addGuestTrafficTypeIntervalID);
if (result.jobstatus == 1) {
returnedTrafficTypes.push(result.jobresult.traffictype);
if(returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added
returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
stepFns.configurePhysicalNetwork({
data: $.extend(args.data, {
returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork
})
});
}
}
else if (result.jobstatus == 2) {
alert("Failed to add Guest traffic type to basic zone. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("Failed to add Guest traffic type to basic zone. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
label = trafficLabelParam('management', data);
$.ajax({
url: createURL("addTrafficType&trafficType=Management&physicalnetworkid=" + returnedBasicPhysicalNetwork.id + label),
dataType: "json",
success: function(json) {
var jobId = json.addtraffictyperesponse.jobid;
var addManagementTrafficTypeIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(addManagementTrafficTypeIntervalID);
if (result.jobstatus == 1) {
returnedTrafficTypes.push(result.jobresult.traffictype);
if(returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added
returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
stepFns.configurePhysicalNetwork({
data: $.extend(args.data, {
returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork
})
});
}
}
else if (result.jobstatus == 2) {
alert("Failed to add Management traffic type to basic zone. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("Failed to add Management traffic type to basic zone. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
// Storage traffic
if (data.physicalNetworks &&
$.inArray('storage', data.physicalNetworks[0].trafficTypes) > -1) {
label = trafficLabelParam('storage', data);
$.ajax({
url: createURL('addTrafficType&physicalnetworkid=' + returnedBasicPhysicalNetwork.id + '&trafficType=Storage' + label),
dataType: "json",
success: function(json) {
var jobId = json.addtraffictyperesponse.jobid;
var addStorageTrafficTypeIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(addStorageTrafficTypeIntervalID);
if (result.jobstatus == 1) {
returnedTrafficTypes.push(result.jobresult.traffictype);
if(returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added
returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
stepFns.configurePhysicalNetwork({
data: $.extend(args.data, {
returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork
})
});
}
}
else if (result.jobstatus == 2) {
alert("Failed to add Management traffic type to basic zone. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("Failed to add Management traffic type to basic zone. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
if (selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true) {
label = trafficLabelParam('public', data);
$.ajax({
url: createURL("addTrafficType&trafficType=Public&physicalnetworkid=" + returnedBasicPhysicalNetwork.id + label),
dataType: "json",
success: function(json) {
var jobId = json.addtraffictyperesponse.jobid;
var addPublicTrafficTypeIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(addPublicTrafficTypeIntervalID);
if (result.jobstatus == 1) {
returnedTrafficTypes.push(result.jobresult.traffictype);
if(returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added
returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
stepFns.configurePhysicalNetwork({
data: $.extend(args.data, {
returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork
})
});
}
}
else if (result.jobstatus == 2) {
alert("Failed to add Public traffic type to basic zone. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("Failed to add Public traffic type to basic zone. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
}
else if (result.jobstatus == 2) {
alert("createPhysicalNetwork failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("createPhysicalNetwork failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
else if(args.data.zone.networkType == "Advanced") {
$(args.data.physicalNetworks).each(function(index) {
var thisPhysicalNetwork = this;
var array1 = [];
array1.push("&name=" + todb(thisPhysicalNetwork.name));
if(thisPhysicalNetwork.isolationMethod != null && thisPhysicalNetwork.isolationMethod.length > 0)
array1.push("&isolationmethods=" + todb(thisPhysicalNetwork.isolationMethod));
$.ajax({
url: createURL("createPhysicalNetwork&zoneid=" + args.data.returnedZone.id + array1.join("")),
dataType: "json",
success: function(json) {
var jobId = json.createphysicalnetworkresponse.jobid;
var createPhysicalNetworkIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(createPhysicalNetworkIntervalID);
if (result.jobstatus == 1) {
var returnedPhysicalNetwork = result.jobresult.physicalnetwork;
returnedPhysicalNetwork.originalId = thisPhysicalNetwork.id;
var returnedTrafficTypes = [];
var label; // Traffic type label
$(thisPhysicalNetwork.trafficTypes).each(function(){
var thisTrafficType = this;
var apiCmd = "addTrafficType&physicalnetworkid=" + returnedPhysicalNetwork.id;
if(thisTrafficType == "public") {
apiCmd += "&trafficType=Public";
label = trafficLabelParam('public', data, index);
}
else if(thisTrafficType == "management") {
apiCmd += "&trafficType=Management";
label = trafficLabelParam('management', data, index);
}
else if(thisTrafficType == "guest") {
apiCmd += "&trafficType=Guest";
label = trafficLabelParam('guest', data, index);
}
else if(thisTrafficType == "storage") {
apiCmd += "&trafficType=Storage";
label = trafficLabelParam('storage', data, index);
}
$.ajax({
url: createURL(apiCmd + label),
dataType: "json",
success: function(json) {
var jobId = json.addtraffictyperesponse.jobid;
var addTrafficTypeIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(addTrafficTypeIntervalID);
if (result.jobstatus == 1) {
returnedTrafficTypes.push(result.jobresult.traffictype);
if(returnedTrafficTypes.length == thisPhysicalNetwork.trafficTypes.length) { //this physical network is complete (specified traffic types are added)
returnedPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
returnedPhysicalNetworks.push(returnedPhysicalNetwork);
if(returnedPhysicalNetworks.length == args.data.physicalNetworks.length) { //all physical networks are complete
stepFns.configurePhysicalNetwork({
data: $.extend(args.data, {
returnedPhysicalNetworks: returnedPhysicalNetworks
})
});
}
}
}
else if (result.jobstatus == 2) {
alert(apiCmd + " failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert(apiCmd + " failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
});
}
else if (result.jobstatus == 2) {
alert("createPhysicalNetwork failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("createPhysicalNetwork failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
});
}
},
//afterCreateZonePhysicalNetworkTrafficTypes: enable physical network, enable virtual router element, enable network service provider
configurePhysicalNetwork: function(args) {
message(dictionary['message.configuring.physical.networks']);
if(args.data.zone.networkType == "Basic") {
$.ajax({
url: createURL("updatePhysicalNetwork&state=Enabled&id=" + args.data.returnedBasicPhysicalNetwork.id),
dataType: "json",
success: function(json) {
var enablePhysicalNetworkIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId=" + json.updatephysicalnetworkresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enablePhysicalNetworkIntervalID);
if (result.jobstatus == 1) {
//alert("updatePhysicalNetwork succeeded.");
// get network service provider ID of Virtual Router
var virtualRouterProviderId;
$.ajax({
url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + args.data.returnedBasicPhysicalNetwork.id),
dataType: "json",
async: false,
success: function(json) {
var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
if(items != null && items.length > 0) {
virtualRouterProviderId = items[0].id;
}
}
});
if(virtualRouterProviderId == null) {
alert("error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID");
return;
}
var virtualRouterElementId;
$.ajax({
url: createURL("listVirtualRouterElements&nspid=" + virtualRouterProviderId),
dataType: "json",
async: false,
success: function(json) {
var items = json.listvirtualrouterelementsresponse.virtualrouterelement;
if(items != null && items.length > 0) {
virtualRouterElementId = items[0].id;
}
}
});
if(virtualRouterElementId == null) {
alert("error: listVirtualRouterElements API doesn't return Virtual Router Element Id");
return;
}
$.ajax({
url: createURL("configureVirtualRouterElement&enabled=true&id=" + virtualRouterElementId),
dataType: "json",
async: false,
success: function(json) {
var enableVirtualRouterElementIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId=" + json.configurevirtualrouterelementresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableVirtualRouterElementIntervalID);
if (result.jobstatus == 1) {
//alert("configureVirtualRouterElement succeeded.");
if(args.data.pluginFrom != null && args.data.pluginFrom.name == "installWizard") {
selectedNetworkOfferingObj = args.data.pluginFrom.selectedNetworkOffering;
}
var data = {
id: virtualRouterProviderId,
state: 'Enabled'
};
$.ajax({
url: createURL("updateNetworkServiceProvider"),
data: data,
async: false,
success: function(json) {
var enableVirtualRouterProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableVirtualRouterProviderIntervalID);
if (result.jobstatus == 1) {
//alert("Virtual Router Provider is enabled");
for(var i = 0; i < selectedBaremetalProviders.length; i++) {
$.ajax({
url: createURL("listNetworkServiceProviders"),
data: {
name: selectedBaremetalProviders[i],
physicalNetworkId: args.data.returnedBasicPhysicalNetwork.id
},
async: false,
success: function(json) {
var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
if(items != null && items.length > 0) {
var providerId = items[0].id;
$.ajax({
url: createURL("updateNetworkServiceProvider"),
data: {
id: providerId,
state: 'Enabled'
},
async: false,
success: function(json) {
var updateNetworkServiceProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(updateNetworkServiceProviderIntervalID);
if (result.jobstatus == 1) { //baremetal provider has been enabled successfully
}
else if (result.jobstatus == 2) {
alert(_s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
alert(parseXMLHttpResponse(XMLHttpResponse));
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
}
});
}
if(args.data.pluginFrom != null && args.data.pluginFrom.name == "installWizard") {
selectedNetworkOfferingHavingSG = args.data.pluginFrom.selectedNetworkOfferingHavingSG;
}
if(selectedNetworkOfferingHavingSG == true) { //need to Enable security group provider first
message(dictionary['message.enabling.security.group.provider']);
// get network service provider ID of Security Group
var securityGroupProviderId;
$.ajax({
url: createURL("listNetworkServiceProviders&name=SecurityGroupProvider&physicalNetworkId=" + args.data.returnedBasicPhysicalNetwork.id),
dataType: "json",
async: false,
success: function(json) {
var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
if(items != null && items.length > 0) {
securityGroupProviderId = items[0].id;
}
}
});
if(securityGroupProviderId == null) {
alert("error: listNetworkServiceProviders API doesn't return security group provider ID");
return;
}
$.ajax({
url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + securityGroupProviderId),
dataType: "json",
async: false,
success: function(json) {
var enableSecurityGroupProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableSecurityGroupProviderIntervalID);
if (result.jobstatus == 1) { //Security group provider has been enabled successfully
stepFns.addNetscalerProvider({
data: args.data
});
}
else if (result.jobstatus == 2) {
alert("failed to enable security group provider. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("failed to enable security group provider. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
else { //selectedNetworkOfferingHavingSG == false
stepFns.addNetscalerProvider({
data: args.data
});
}
}
else if (result.jobstatus == 2) {
alert("failed to enable Virtual Router Provider. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("failed to enable Virtual Router Provider. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
else if (result.jobstatus == 2) {
alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("configureVirtualRouterElement failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
else if (result.jobstatus == 2) {
alert("updatePhysicalNetwork failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("updatePhysicalNetwork failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
else if(args.data.zone.networkType == "Advanced") {
$(args.data.returnedPhysicalNetworks).each(function(){
var thisPhysicalNetwork = this;
$.ajax({
url: createURL("updatePhysicalNetwork&state=Enabled&id=" + thisPhysicalNetwork.id),
dataType: "json",
success: function(json) {
var jobId = json.updatephysicalnetworkresponse.jobid;
var enablePhysicalNetworkIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId="+jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enablePhysicalNetworkIntervalID);
if (result.jobstatus == 1) {
//alert("enable physical network succeeded.");
// ***** Virtual Router ***** (begin) *****
var virtualRouterProviderId;
$.ajax({
url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + thisPhysicalNetwork.id),
dataType: "json",
async: false,
success: function(json) {
var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
if(items != null && items.length > 0) {
virtualRouterProviderId = items[0].id;
}
}
});
if(virtualRouterProviderId == null) {
alert("error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID");
return;
}
var virtualRouterElementId;
$.ajax({
url: createURL("listVirtualRouterElements&nspid=" + virtualRouterProviderId),
dataType: "json",
async: false,
success: function(json) {
var items = json.listvirtualrouterelementsresponse.virtualrouterelement;
if(items != null && items.length > 0) {
virtualRouterElementId = items[0].id;
}
}
});
if(virtualRouterElementId == null) {
alert("error: listVirtualRouterElements API doesn't return Virtual Router Element Id");
return;
}
$.ajax({
url: createURL("configureVirtualRouterElement&enabled=true&id=" + virtualRouterElementId),
dataType: "json",
async: false,
success: function(json) {
var jobId = json.configurevirtualrouterelementresponse.jobid;
var enableVirtualRouterElementIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId="+jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableVirtualRouterElementIntervalID);
if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded
$.ajax({
url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + virtualRouterProviderId),
dataType: "json",
async: false,
success: function(json) {
var jobId = json.updatenetworkserviceproviderresponse.jobid;
var enableVirtualRouterProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId="+jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableVirtualRouterProviderIntervalID);
if (result.jobstatus == 1) { //Virtual Router Provider has been enabled successfully
advZoneConfiguredVirtualRouterCount++;
if(advZoneConfiguredVirtualRouterCount == args.data.returnedPhysicalNetworks.length) { //not call next stepFns.addXXX() until virtualRouter of all physical networks get configured
if(args.data.zone.sgEnabled != true) { //Advanced SG-disabled zone
stepFns.addPod({
data: args.data
});
}
else { //args.data.zone.sgEnabled == true //Advanced SG-enabled zone
stepFns.addGuestNetwork({
data: args.data
});
}
}
}
else if (result.jobstatus == 2) {
alert("failed to enable Virtual Router Provider. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
else if (result.jobstatus == 2) {
alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("configureVirtualRouterElement failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
// ***** Virtual Router ***** (end) *****
// ***** Internal LB ***** (begin) *****
var internalLbProviderId;
$.ajax({
url: createURL("listNetworkServiceProviders&name=Internallbvm&physicalNetworkId=" + thisPhysicalNetwork.id),
dataType: "json",
async: false,
success: function(json) {
var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
if(items != null && items.length > 0) {
internalLbProviderId = items[0].id;
}
}
});
if(internalLbProviderId == null) {
alert("error: listNetworkServiceProviders API doesn't return internalLb provider ID");
return;
}
var internalLbElementId;
$.ajax({
url: createURL("listInternalLoadBalancerElements&nspid=" + internalLbProviderId),
dataType: "json",
async: false,
success: function(json) {
var items = json.listinternalloadbalancerelementsresponse.internalloadbalancerelement;
if(items != null && items.length > 0) {
internalLbElementId = items[0].id;
}
}
});
if(internalLbElementId == null) {
alert("error: listInternalLoadBalancerElements API doesn't return Internal LB Element Id");
return;
}
$.ajax({
url: createURL("configureInternalLoadBalancerElement&enabled=true&id=" + internalLbElementId),
dataType: "json",
async: false,
success: function(json) {
var jobId = json.configureinternalloadbalancerelementresponse.jobid;
var enableInternalLbElementIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId="+jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableInternalLbElementIntervalID);
if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded
$.ajax({
url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + internalLbProviderId),
dataType: "json",
async: false,
success: function(json) {
var jobId = json.updatenetworkserviceproviderresponse.jobid;
var enableInternalLbProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId="+jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableInternalLbProviderIntervalID);
if (result.jobstatus == 1) { //Internal LB has been enabled successfully
//don't need to do anything here
}
else if (result.jobstatus == 2) {
alert("failed to enable Internal LB Provider. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("failed to enable Internal LB Provider. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
else if (result.jobstatus == 2) {
alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("configureVirtualRouterElement failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
// ***** Internal LB ***** (end) *****
if(args.data.zone.sgEnabled != true) { //Advanced SG-disabled zone
// ***** VPC Virtual Router ***** (begin) *****
var vpcVirtualRouterProviderId;
$.ajax({
url: createURL("listNetworkServiceProviders&name=VpcVirtualRouter&physicalNetworkId=" + thisPhysicalNetwork.id),
dataType: "json",
async: false,
success: function(json) {
var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
if(items != null && items.length > 0) {
vpcVirtualRouterProviderId = items[0].id;
}
}
});
if(vpcVirtualRouterProviderId == null) {
alert("error: listNetworkServiceProviders API doesn't return VpcVirtualRouter provider ID");
return;
}
var vpcVirtualRouterElementId;
$.ajax({
url: createURL("listVirtualRouterElements&nspid=" + vpcVirtualRouterProviderId),
dataType: "json",
async: false,
success: function(json) {
var items = json.listvirtualrouterelementsresponse.virtualrouterelement;
if(items != null && items.length > 0) {
vpcVirtualRouterElementId = items[0].id;
}
}
});
if(vpcVirtualRouterElementId == null) {
alert("error: listVirtualRouterElements API doesn't return VPC Virtual Router Element Id");
return;
}
$.ajax({
url: createURL("configureVirtualRouterElement&enabled=true&id=" + vpcVirtualRouterElementId),
dataType: "json",
async: false,
success: function(json) {
var jobId = json.configurevirtualrouterelementresponse.jobid;
var enableVpcVirtualRouterElementIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId="+jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableVpcVirtualRouterElementIntervalID);
if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded
$.ajax({
url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + vpcVirtualRouterProviderId),
dataType: "json",
async: false,
success: function(json) {
var jobId = json.updatenetworkserviceproviderresponse.jobid;
var enableVpcVirtualRouterProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId="+jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableVpcVirtualRouterProviderIntervalID);
if (result.jobstatus == 1) { //VPC Virtual Router has been enabled successfully
//don't need to do anything here
}
else if (result.jobstatus == 2) {
alert("failed to enable VPC Virtual Router Provider. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("failed to enable VPC Virtual Router Provider. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
else if (result.jobstatus == 2) {
alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("configureVirtualRouterElement failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
// ***** VPC Virtual Router ***** (end) *****
}
else { //args.data.zone.sgEnabled == true //Advanced SG-enabled zone
message(dictionary['message.enabling.security.group.provider']);
// get network service provider ID of Security Group
var securityGroupProviderId;
$.ajax({
url: createURL("listNetworkServiceProviders&name=SecurityGroupProvider&physicalNetworkId=" + thisPhysicalNetwork.id),
dataType: "json",
async: false,
success: function(json) {
var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
if(items != null && items.length > 0) {
securityGroupProviderId = items[0].id;
}
}
});
if(securityGroupProviderId == null) {
alert("error: listNetworkServiceProviders API doesn't return security group provider ID");
return;
}
$.ajax({
url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + securityGroupProviderId),
dataType: "json",
async: false,
success: function(json) {
var enableSecurityGroupProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(enableSecurityGroupProviderIntervalID);
if (result.jobstatus == 1) { //Security group provider has been enabled successfully
//don't need to do anything here
}
else if (result.jobstatus == 2) {
alert("failed to enable security group provider. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("failed to enable security group provider. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
}
}
else if (result.jobstatus == 2) {
alert("failed to enable physical network. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
alert("failed to enable physical network. Error: " + parseXMLHttpResponse(XMLHttpResponse));
}
});
}, g_queryAsyncJobResultInterval);
}
});
});
}
},
addNetscalerProvider: function(args) {
if(selectedNetworkOfferingHavingNetscaler == true) {
message(dictionary['message.adding.Netscaler.provider']);
$.ajax({
url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + args.data.returnedBasicPhysicalNetwork.id),
dataType: "json",
async: false,
success: function(json) {
var addNetscalerProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobId=" + json.addnetworkserviceproviderresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
}
else {
clearInterval(addNetscalerProviderIntervalID);
if (result.jobstatus == 1) {
args.data.returnedNetscalerProvider = result.jobresult.networkserviceprovider;
stepFns.addNetscalerDevice({
data: args.data
});
}
else if (result.jobstatus == 2) {
alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + errorMsg);
}
});
}, g_queryAsyncJobResultInterval);
}
});
//add netscaler provider (end)
}
else { //selectedNetworkOfferingHavingNetscaler == false
//create a guest network for basic zone
stepFns.addGuestNetwork({
data: args.data
});
}
},
addNetscalerDevice: function(args) {
message(dictionary['message.adding.Netscaler.device']);
var array1 = [];
array1.push("&physicalnetworkid=" + args.data.returnedBasicPhysicalNetwork.id);
array1.push("&username=" + todb(args.data.basicPhysicalNetwork.username));
array1.push("&password=" + todb(args.data.basicPhysicalNetwork.password));
array1.push("&networkdevicetype=" + todb(args.data.basicPhysicalNetwork.networkdevicetype));
array1.push("&gslbprovider=" + (args.data.basicPhysicalNetwork.gslbprovider == "on"));
array1.push("&gslbproviderpublicip=" + todb(args.data.basicPhysicalNetwork.gslbproviderpublicip));
array1.push("&gslbproviderprivateip=" + todb(args.data.basicPhysicalNetwork.gslbproviderprivateip));
//construct URL starts here
var url = [];
var ip = args.data.basicPhysicalNetwork.ip;
url.push("https://" + ip);
var isQuestionMarkAdded = false;
var publicInterface = args.data.basicPhysicalNetwork.publicinterface;
if(publicInterface != null && publicInterface.length > 0) {
if(isQuestionMarkAdded == false) {
url.push("?");
isQuestionMarkAdded = true;
}
else {
url.push("&");
}
url.push("publicinterface=" + publicInterface);
}
var privateInterface = args.data.basicPhysicalNetwork.privateinterface;
if(privateInterface != null && privateInterface.length > 0) {
if(isQuestionMarkAdded == false) {
url.push("?");
isQuestionMarkAdded = true;
}
else {
url.push("&");
}
url.push("privateinterface=" + privateInterface);
}
var numretries = args.data.basicPhysicalNetwork.numretries;
if(numretries != null && numretries.length > 0) {
if(isQuestionMarkAdded == false) {
url.push("?");
isQuestionMarkAdded = true;
}
else {
url.push("&");
}
url.push("numretries=" + numretries);
}
var isInline = args.data.basicPhysicalNetwork.inline;
if(isInline != null && isInline.length > 0) {
if(isQuestionMarkAdded == false) {
url.push("?");
isQuestionMarkAdded = true;
}
else {
url.push("&");
}
url.push("inline=" + isInline);
}
var capacity = args.data.basicPhysicalNetwork.capacity;
if(capacity != null && capacity.length > 0) {
if(isQuestionMarkAdded == false) {
url.push("?");
isQuestionMarkAdded = true;
}
else {
url.push("&");
}
url.push("lbdevicecapacity=" + capacity);
}
var dedicated = (args.data.basicPhysicalNetwork.dedicated == "on"); //boolean (true/false)
if(isQuestionMarkAdded == false) {
url.push("?");
isQuestionMarkAdded = true;
}
else {
url.push("&");
}
url.push("lbdevicededicated=" + dedicated.toString());
array1.push("&url=" + todb(url.join("")));
//construct URL ends here
$.ajax({
url: createURL("addNetscalerLoadBalancer" + array1.join("")),
dataType: "json",
success: function(json) {
var addNetscalerLoadBalancerIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + json.addnetscalerloadbalancerresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if(result.jobstatus == 0) {
return;
}
else {
clearInterval(addNetscalerLoadBalancerIntervalID);
if(result.jobstatus == 1) {
args.data.returnedNetscalerProvider.returnedNetscalerloadbalancer = result.jobresult.netscalerloadbalancer;
$.ajax({
url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + args.data.returnedNetscalerProvider.id),
dataType: "json",
success: function(json) {
var enableNetscalerProviderIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + json.updatenetworkserviceproviderresponse.jobid),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if(result.jobstatus == 0) {
return;
}
else {
clearInterval(enableNetscalerProviderIntervalID);
if(result.jobstatus == 1) {
stepFns.addGuestNetwork({
data: args.data
});
}
else if(result.jobstatus == 2) {
alert("failed to enable Netscaler provider. Error: " + _s(result.jobresult.errortext));
}
}
}
});
}, g_queryAsyncJobResultInterval);
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("failed to enable Netscaler provider. Error: " + errorMsg);
}
});
}
else if(result.jobstatus == 2) { //addNetscalerLoadBalancer failed
error('addNetscalerDevice', _s(result.jobresult.errortext), { fn: 'addNetscalerDevice', args: args });
}
}
}
});
}, g_queryAsyncJobResultInterval);
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('addNetscalerDevice', errorMsg, { fn: 'addNetscalerDevice', args: args });
}
});
},
addGuestNetwork: function(args) { //create a guest network for Basic zone or Advanced zone with SG
message(dictionary['message.creating.guest.network']);
var data = {
zoneid: args.data.returnedZone.id,
name: 'defaultGuestNetwork',
displaytext: 'defaultGuestNetwork',
networkofferingid: args.data.zone.networkOfferingId
};
//Advanced zone with SG
if(args.data.zone.networkType == "Advanced" && args.data.zone.sgEnabled == true) {
$.extend(data, {
gateway: args.data.guestTraffic.guestGateway,
netmask: args.data.guestTraffic.guestNetmask,
startip: args.data.guestTraffic.guestStartIp,
vlan: args.data.guestTraffic.vlanId
});
if(args.data.guestTraffic.guestEndIp != null && args.data.guestTraffic.guestEndIp.length > 0) {
$.extend(data, {
endip: args.data.guestTraffic.guestEndIp
});
}
}
$.ajax({
url: createURL('createNetwork'),
data: data,
async: false,
success: function(json) {
//basic zone has only one physical network => addPod() will be called only once => so don't need to double-check before calling addPod()
stepFns.addPod({
data: $.extend(args.data, {
returnedGuestNetwork: json.createnetworkresponse.network
})
});
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("failed to create a guest network for basic zone. Error: " + errorMsg);
}
});
},
addPod: function(args) {
message(dictionary['message.creating.pod']);
var array3 = [];
array3.push("&zoneId=" + args.data.returnedZone.id);
array3.push("&name=" + todb(args.data.pod.name));
array3.push("&gateway=" + todb(args.data.pod.reservedSystemGateway));
array3.push("&netmask=" + todb(args.data.pod.reservedSystemNetmask));
array3.push("&startIp=" + todb(args.data.pod.reservedSystemStartIp));
var endip = args.data.pod.reservedSystemEndIp; //optional
if (endip != null && endip.length > 0)
array3.push("&endIp=" + todb(endip));
$.ajax({
url: createURL("createPod" + array3.join("")),
dataType: "json",
async: false,
success: function(json) {
stepFns.configurePublicTraffic({
data: $.extend(args.data, {
returnedPod: json.createpodresponse.pod
})
});
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('addPod', errorMsg, { fn: 'addPod', args: args });
}
});
},
configurePublicTraffic: function(args) {
if((args.data.zone.networkType == "Basic" && (selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true))
||(args.data.zone.networkType == "Advanced" && args.data.zone.sgEnabled != true)) {
message(dictionary['message.configuring.public.traffic']);
var stopNow = false;
$(args.data.publicTraffic).each(function(){
var thisPublicVlanIpRange = this;
//check whether the VlanIpRange exists or not (begin)
var isExisting = false;
$(returnedPublicVlanIpRanges).each(function() {
if(this.vlan == thisPublicVlanIpRange.vlanid && this.startip == thisPublicVlanIpRange.startip && this.netmask == thisPublicVlanIpRange.netmask && this.gateway == thisPublicVlanIpRange.gateway) {
isExisting = true;
return false; //break each loop
}
});
if(isExisting == true)
return; //skip current item to next item (continue each loop)
//check whether the VlanIpRange exists or not (end)
var array1 = [];
array1.push("&zoneId=" + args.data.returnedZone.id);
if (this.vlanid != null && this.vlanid.length > 0)
array1.push("&vlan=" + todb(this.vlanid));
else
array1.push("&vlan=untagged");
array1.push("&gateway=" + this.gateway);
array1.push("&netmask=" + this.netmask);
array1.push("&startip=" + this.startip);
if(this.endip != null && this.endip.length > 0)
array1.push("&endip=" + this.endip);
if(args.data.zone.networkType == "Basic") {
array1.push("&forVirtualNetwork=true");
}
else if(args.data.zone.networkType == "Advanced") {
if(args.data.zone.sgEnabled != true) {
array1.push("&forVirtualNetwork=true");
}
else { //args.data.zone.sgEnabled == true
array1.push("&forVirtualNetwork=false");
}
}
$.ajax({
url: createURL("createVlanIpRange" + array1.join("")),
dataType: "json",
async: false,
success: function(json) {
var item = json.createvlaniprangeresponse.vlan;
returnedPublicVlanIpRanges.push(item);
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('configurePublicTraffic', errorMsg, { fn: 'configurePublicTraffic', args: args });
stopNow = true;
}
});
if(stopNow == true)
return false; //break each loop, don't create next VlanIpRange
});
if(stopNow == true)
return; //stop the whole process
stepFns.configureStorageTraffic({
data: $.extend(args.data, {
returnedPublicTraffic: returnedPublicVlanIpRanges
})
});
}
else if(args.data.zone.networkType == "Advanced" && args.data.zone.sgEnabled == true) { // Advanced SG-enabled zone doesn't have public traffic type
stepFns.configureStorageTraffic({
data: args.data
});
}
else { //basic zone without public traffic type , skip to next step
if (data.physicalNetworks && $.inArray('storage', data.physicalNetworks[0].trafficTypes) > -1) {
stepFns.configureStorageTraffic({
data: args.data
});
} else {
stepFns.configureGuestTraffic({
data: args.data
});
}
}
},
configureStorageTraffic: function(args) {
var complete = function(data) {
stepFns.configureGuestTraffic({
data: $.extend(args.data, data)
});
};
var targetNetwork = $.grep(args.data.physicalNetworks, function(net) {
return $.inArray('storage', net.trafficTypes) > -1; });
if (!targetNetwork.length) {
return complete({});
}
message(dictionary['message.configuring.storage.traffic']);
var storageIPRanges = args.data.storageTraffic;
var tasks = [];
var taskTimer;
$(storageIPRanges).each(function() {
var item = this;
if('vlan' in item && (item.vlan == null || item.vlan.length == 0))
delete item.vlan;
$.ajax({
url: createURL('createStorageNetworkIpRange'),
data: $.extend(true, {}, item, {
zoneid: args.data.returnedZone.id,
podid: args.data.returnedPod.id
}),
success: function(json) {
tasks.push({
jobid: json.createstoragenetworkiprangeresponse.jobid,
complete: false
});
},
error: function(json) {
tasks.push({
error: true,
message: parseXMLHttpResponse(json)
});
}
});
});
taskTimer = setInterval(function() {
var completedTasks = $.grep(tasks, function(task) {
return task.complete || task.error;
});
var errorTasks = $.grep(tasks, function(task) {
return task.error;
});
if (completedTasks.length == storageIPRanges.length) {
clearInterval(taskTimer);
if (errorTasks.length) {
return error('configureStorageTraffic', errorTasks[0].message, {
fn: 'configureStorageTraffic', args: args
});
}
return complete({});
}
if (tasks.length == storageIPRanges.length) {
$(tasks).each(function() {
var task = this;
if (task.error) return true;
pollAsyncJobResult({
_custom: { jobId: task.jobid },
complete: function() {
task.complete = true;
},
error: function(args) {
task.error = true;
task.message = args.message;
}
});
return true;
});
}
return true;
}, 1000);
return true;
},
configureGuestTraffic: function(args) {
if(skipGuestTrafficStep == true) {
stepFns.addCluster({
data: args.data
});
return;
}
message(dictionary['message.configuring.guest.traffic']);
if(args.data.returnedZone.networktype == "Basic") { //create an VlanIpRange for guest network in basic zone
var array1 = [];
array1.push("&podid=" + args.data.returnedPod.id);
array1.push("&networkid=" + args.data.returnedGuestNetwork.id);
array1.push("&gateway=" + args.data.guestTraffic.guestGateway);
array1.push("&netmask=" + args.data.guestTraffic.guestNetmask);
array1.push("&startip=" + args.data.guestTraffic.guestStartIp);
if(args.data.guestTraffic.guestEndIp != null && args.data.guestTraffic.guestEndIp.length > 0)
array1.push("&endip=" + args.data.guestTraffic.guestEndIp);
array1.push("&forVirtualNetwork=false"); //indicates this new IP range is for guest network, not public network
$.ajax({
url: createURL("createVlanIpRange" + array1.join("")),
dataType: "json",
success: function(json) {
args.data.returnedGuestNetwork.returnedVlanIpRange = json.createvlaniprangeresponse.vlan;
if(args.data.zone.hypervisor == "BareMetal") { //if hypervisor is BareMetal, zone creation is completed at this point.
complete({
data: args.data
});
}
else {
stepFns.addCluster({
data: args.data
});
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('configureGuestTraffic', errorMsg, { fn: 'configureGuestTraffic', args: args });
}
});
}
else if(args.data.returnedZone.networktype == "Advanced") { //update VLAN in physical network(s) in advanced zone
var physicalNetworksHavingGuestIncludingVlan = [];
$(args.data.physicalNetworks).each(function(){
if(this.guestConfiguration != null && this.guestConfiguration.vlanRangeStart != null && this.guestConfiguration.vlanRangeStart.length > 0) {
physicalNetworksHavingGuestIncludingVlan.push(this);
}
});
if(physicalNetworksHavingGuestIncludingVlan.length == 0) {
stepFns.addCluster({
data: args.data
});
}
else {
var updatedCount = 0;
$(physicalNetworksHavingGuestIncludingVlan).each(function(){
var vlan;
if(this.guestConfiguration.vlanRangeEnd == null || this.guestConfiguration.vlanRangeEnd.length == 0)
vlan = this.guestConfiguration.vlanRangeStart;
else
vlan = this.guestConfiguration.vlanRangeStart + "-" + this.guestConfiguration.vlanRangeEnd;
var originalId = this.id;
var returnedId;
$(args.data.returnedPhysicalNetworks).each(function(){
if(this.originalId == originalId) {
returnedId = this.id;
return false; //break the loop
}
});
$.ajax({
url: createURL("updatePhysicalNetwork&id=" + returnedId + "&vlan=" + todb(vlan)),
dataType: "json",
success: function(json) {
var jobId = json.updatephysicalnetworkresponse.jobid;
var updatePhysicalNetworkVlanIntervalID = setInterval(function() {
$.ajax({
url: createURL("queryAsyncJobResult&jobid=" + jobId),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if(result.jobstatus == 0) {
return;
}
else {
clearInterval(updatePhysicalNetworkVlanIntervalID);
if(result.jobstatus == 1) {
updatedCount++;
if(updatedCount == physicalNetworksHavingGuestIncludingVlan.length) {
stepFns.addCluster({
data: args.data
});
}
}
else if(result.jobstatus == 2){
alert("error: " + _s(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('configureGuestTraffic', errorMsg, { fn: 'configureGuestTraffic', args: args });
}
});
}, g_queryAsyncJobResultInterval);
}
});
});
}
}
},
addCluster: function(args) {
message(dictionary['message.creating.cluster']);
// Have cluster use zone's hypervisor
args.data.cluster.hypervisor = args.data.zone.hypervisor ?
args.data.zone.hypervisor : args.data.cluster.hypervisor;
var array1 = [];
array1.push("&zoneId=" + args.data.returnedZone.id);
array1.push("&hypervisor=" + args.data.cluster.hypervisor);
var clusterType;
if(args.data.cluster.hypervisor == "VMware")
clusterType="ExternalManaged";
else
clusterType="CloudManaged";
array1.push("&clustertype=" + clusterType);
array1.push("&podId=" + args.data.returnedPod.id);
var clusterName = args.data.cluster.name;
if(args.data.cluster.hypervisor == "VMware") {
array1.push("&username=" + todb(args.data.cluster.vCenterUsername));
array1.push("&password=" + todb(args.data.cluster.vCenterPassword));
//dvswitch is enabled
if(args.data.cluster.vSwitchPublicType != "")
array1.push('&publicvswitchtype=' + args.data.cluster.vSwitchPublicType);
if(args.data.cluster.vSwitchPublicName != "")
array1.push("&publicvswitchname=" +args.data.cluster.vSwitchPublicName);
if(args.data.cluster.vSwitchGuestType != "")
array1.push('&guestvswitchtype=' + args.data.cluster.vSwitchGuestType);
if(args.data.cluster.vSwitchGuestName !="")
array1.push("&guestvswitchname=" +args.data.cluster.vSwitchGuestName);
if (args.data.cluster.vsmipaddress) { // vSwitch is enabled
array1.push('&vsmipaddress=' + args.data.cluster.vsmipaddress);
array1.push('&vsmusername=' + args.data.cluster.vsmusername);
array1.push('&vsmpassword=' + args.data.cluster.vsmpassword);
}
var hostname = args.data.cluster.vCenterHost;
var dcName = args.data.cluster.vCenterDatacenter;
var url;
if(hostname.indexOf("http://") == -1)
url = "http://" + hostname;
else
url = hostname;
url += "/" + dcName + "/" + clusterName;
array1.push("&url=" + todb(url));
clusterName = hostname + "/" + dcName + "/" + clusterName; //override clusterName
}
array1.push("&clustername=" + todb(clusterName));
$.ajax({
url: createURL("addCluster" + array1.join("")),
dataType: "json",
async: true,
success: function(json) {
if(args.data.cluster.hypervisor != "VMware") {
stepFns.addHost({
data: $.extend(args.data, {
returnedCluster: json.addclusterresponse.cluster[0]
})
});
}
else {
stepFns.addPrimaryStorage({
data: $.extend(args.data, {
returnedCluster: json.addclusterresponse.cluster[0]
})
});
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('addCluster', errorMsg, { fn: 'addCluster', args: args });
}
});
},
addHost: function(args) {
message(dictionary['message.adding.host']);
var data = {
zoneid: args.data.returnedZone.id,
podid: args.data.returnedPod.id,
clusterid: args.data.returnedCluster.id,
hypervisor: args.data.returnedCluster.hypervisortype,
clustertype: args.data.returnedCluster.clustertype,
hosttags: args.data.host.hosttags,
username: args.data.host.username,
password: args.data.host.password
};
var hostname = args.data.host.hostname;
var url;
if(hostname.indexOf("http://")==-1) {
url = "http://" + hostname;
}
else {
url = hostname;
}
$.extend(data,{
url: url
});
if (args.data.cluster.hypervisor == "BareMetal") {
$.extend(data, {
cpunumber: args.data.host.baremetalCpuCores,
cpuspeed: args.data.host.baremetalCpu,
memory: args.data.host.baremetalMemory,
hostmac: args.data.host.baremetalMAC
});
}
else if(args.data.cluster.hypervisor == "Ovm") {
$.extend(data, {
agentusername: args.data.host.agentUsername,
agentpassword: args.data.host.agentPassword
});
}
$.ajax({
url: createURL("addHost"),
type: "POST",
data: data,
success: function(json) {
stepFns.addPrimaryStorage({
data: $.extend(args.data, {
returnedHost: json.addhostresponse.host[0]
})
});
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('addHost', errorMsg, { fn: 'addHost', args: args });
}
});
},
addPrimaryStorage: function(args) {
if(args.data.zone.localstorageenabled == 'on') { //use local storage, don't need primary storage. So, skip this step.
stepFns.addSecondaryStorage({
data: args.data
});
return;
}
message(dictionary['message.creating.primary.storage']);
var array1 = [];
array1.push("&zoneid=" + args.data.returnedZone.id);
array1.push("&podId=" + args.data.returnedPod.id);
array1.push("&clusterid=" + args.data.returnedCluster.id);
array1.push("&name=" + todb(args.data.primaryStorage.name));
array1.push("&scope=" + todb(args.data.primaryStorage.scope));
var server = args.data.primaryStorage.server;
var url = null;
if (args.data.primaryStorage.protocol == "nfs") {
//var path = trim($thisDialog.find("#add_pool_path").val());
var path = args.data.primaryStorage.path;
if(path.substring(0,1) != "/")
path = "/" + path;
url = nfsURL(server, path);
}
else if (args.data.primaryStorage.protocol == "PreSetup") {
//var path = trim($thisDialog.find("#add_pool_path").val());
var path = args.data.primaryStorage.path;
if(path.substring(0,1) != "/")
path = "/" + path;
url = presetupURL(server, path);
}
else if (args.data.primaryStorage.protocol == "ocfs2") {
//var path = trim($thisDialog.find("#add_pool_path").val());
var path = args.data.primaryStorage.path;
if(path.substring(0,1) != "/")
path = "/" + path;
url = ocfs2URL(server, path);
}
else if (args.data.primaryStorage.protocol == "SharedMountPoint") {
//var path = trim($thisDialog.find("#add_pool_path").val());
var path = args.data.primaryStorage.path;
if(path.substring(0,1) != "/")
path = "/" + path;
url = SharedMountPointURL(server, path);
}
else if (args.data.primaryStorage.protocol == "clvm") {
//var vg = trim($thisDialog.find("#add_pool_clvm_vg").val());
var vg = args.data.primaryStorage.volumegroup;
if(vg.substring(0,1) != "/")
vg = "/" + vg;
url = clvmURL(vg);
}
else if (args.data.primaryStorage.protocol == "vmfs") {
//var path = trim($thisDialog.find("#add_pool_vmfs_dc").val());
var path = args.data.primaryStorage.vCenterDataCenter;
if(path.substring(0,1) != "/")
path = "/" + path;
path += "/" + args.data.primaryStorage.vCenterDataStore;
url = vmfsURL("dummy", path);
}
else {
//var iqn = trim($thisDialog.find("#add_pool_iqn").val());
var iqn = args.data.primaryStorage.iqn;
if(iqn.substring(0,1) != "/")
iqn = "/" + iqn;
var lun = args.data.primaryStorage.lun;
url = iscsiURL(server, iqn, lun);
}
array1.push("&url=" + todb(url));
if(args.data.primaryStorage.storageTags != null && args.data.primaryStorage.storageTags.length > 0)
array1.push("&tags=" + todb(args.data.primaryStorage.storageTags));
$.ajax({
url: createURL("createStoragePool" + array1.join("")),
dataType: "json",
success: function(json) {
stepFns.addSecondaryStorage({
data: $.extend(args.data, {
returnedPrimaryStorage: json.createstoragepoolresponse.storagepool
})
});
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('addPrimaryStorage', errorMsg, { fn: 'addPrimaryStorage', args: args });
}
});
},
addSecondaryStorage: function(args) {
message(dictionary['message.creating.secondary.storage']);
var nfs_server = args.data.secondaryStorage.nfsServer;
var path = args.data.secondaryStorage.path;
var url = nfsURL(nfs_server, path);
$.ajax({
url: createURL("addSecondaryStorage&zoneId=" + args.data.returnedZone.id + "&url=" + todb(url)),
dataType: "json",
success: function(json) {
complete({
data: $.extend(args.data, {
returnedSecondaryStorage: json.addsecondarystorageresponse.secondarystorage
})
});
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
error('addSecondaryStorage', errorMsg, { fn: 'addSecondaryStorage', args: args });
}
});
}
};
var complete = function(args) {
message(dictionary['message.Zone.creation.complete']);
success(args);
};
if (startFn) {
stepFns[startFn.fn]({
data: $.extend(startFn.args.data, data)
});
} else {
stepFns.addZone({});
}
},
enableZoneAction: function(args) {
$.ajax({
url: createURL("updateZone&allocationstate=Enabled&id=" + args.launchData.returnedZone.id),
dataType: "json",
success: function(json) {
args.formData.returnedZone = json.updatezoneresponse.zone;
args.response.success();
}
});
}
};
}(cloudStack, jQuery));