/*** Generated by streamline 0.10.17 (callbacks) - DO NOT EDIT ***/ var __rt=require('streamline/lib/callbacks/runtime').runtime(__filename, false),__func=__rt.__func,__cb=__rt.__cb,__catch=__rt.__catch,__tryCatch=__rt.__tryCatch; var __ = require("underscore");














var util = require("util");
var utils = require("../../../util/utils");
var validation = require("../../../util/validation");
var $ = utils.getLocaleString;
var constants = require("./constants");
var resourceUtils = require("../resource/resourceUtils");
var tagUtils = require("../tag/tagUtils");
var PublicIp = require("./publicIp");
var Subnet = require("./subnet");

function LoadBalancer(cli, networkManagementClient) {
  this.networkManagementClient = networkManagementClient;
  this.publicIpCrud = new PublicIp(cli, networkManagementClient);
  this.subnetCrud = new Subnet(cli, networkManagementClient);
  this.output = cli.output;
  this.interaction = cli.interaction;};


__.extend(LoadBalancer.prototype, {




  create: function create__1(resourceGroupName, lbName, options, _) { var self, parameters, lb, progress, __this = this; var __frame = { name: "create__1", line: 39 }; return __func(_, this, arguments, create__1, 3, __frame, function __$create__1() { self = __this;


      parameters = {
        location: options.location };


      parameters = self._parseLoadBalancer(parameters, options);

      return self.get(resourceGroupName, lbName, __cb(_, __frame, 9, 18, function ___(__0, __1) { lb = __1;
        if (lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" already exists in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        progress = self.interaction.progress(util.format($("Creating load balancer \"%s\""), lbName)); return (function ___(__then) { (function ___(_) { __tryCatch(_, function __$create__1() {

              return self.networkManagementClient.loadBalancers.createOrUpdate(resourceGroupName, lbName, parameters, __cb(_, __frame, 16, 54, function ___(__0, __2) { lb = __2; _(null, null, true); }, true)); }); })(function ___(__e, __r, __cont) { (function ___(__then) { __tryCatch(_, function __$create__1() {

                progress.end(); __then(); }); })(function ___() { __tryCatch(_, function ___() { if (__cont) { __then(); } else { _(__e, __r); }; }); }); }); })(function ___() { __tryCatch(_, function __$create__1() {

            self._showLoadBalancer(lb, resourceGroupName, lbName); _(); }); }); }, true)); }); },


  set: function set__2(resourceGroupName, lbName, options, _) { var self, lb, __this = this; var __frame = { name: "set__2", line: 62 }; return __func(_, this, arguments, set__2, 3, __frame, function __$set__2() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        lb = self._parseLoadBalancer(lb, options);

        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 10, 14, function ___(__0, __2) { lb = __2;
          self._showLoadBalancer(lb, resourceGroupName, lbName); _(); }, true)); }, true)); }); },


  list: function list__3(options, _) { var self, progress, lbs, __this = this; var __frame = { name: "list__3", line: 76 }; return __func(_, this, arguments, list__3, 1, __frame, function __$list__3() { self = __this;


      progress = self.interaction.progress($("Looking up load balancers"));
      lbs = null; return (function ___(__then) { (function ___(_) { __tryCatch(_, function __$list__3() { return (function __$list__3(__then) {


              if (options.resourceGroup) {
                return self.networkManagementClient.loadBalancers.list(options.resourceGroup, __cb(_, __frame, 8, 57, function ___(__0, __1) { lbs = __1; __then(); }, true)); } else {

                return self.networkManagementClient.loadBalancers.listAll(__cb(_, __frame, 10, 57, function ___(__0, __2) { lbs = __2; __then(); }, true)); } ; })(function __$list__3() { _(null, null, true); }); }); })(function ___(__e, __r, __cont) { (function ___(__then) { __tryCatch(_, function __$list__3() {


              progress.end(); __then(); }); })(function ___() { __tryCatch(_, function ___() { if (__cont) { __then(); } else { _(__e, __r); }; }); }); }); })(function ___() { __tryCatch(_, function __$list__3() {


          self.interaction.formatOutput(lbs, function(lbs) {
            if ((lbs.length === 0)) {
              self.output.warn($("No load balancers found")); }
             else {
              self.output.table(lbs, function(row, lb) {
                row.cell($("Name"), lb.name);
                row.cell($("Location"), lb.location);
                var resInfo = resourceUtils.getResourceInformation(lb.id);
                row.cell($("Resource group"), resInfo.resourceGroup);
                row.cell($("Provisioning state"), lb.provisioningState);
                row.cell($("Probe"), lb.probes.length);
                row.cell($("FIP"), lb.frontendIPConfigurations.length);
                row.cell($("Backend pool"), lb.backendAddressPools.length);
                row.cell($("Rule"), lb.loadBalancingRules.length);
                row.cell($("Inbound NAT rule"), lb.inboundNatRules.length);
                row.cell($("Inbound NAT pool"), lb.inboundNatPools.length);
                row.cell($("Outbound NAT rule"), lb.outboundNatRules.length); }); } ; }); _(); }); }); }); },





  show: function show__4(resourceGroupName, lbName, options, _) { var self, lb, __this = this; var __frame = { name: "show__4", line: 114 }; return __func(_, this, arguments, show__4, 3, __frame, function __$show__4() { self = __this;

      return self.get(resourceGroupName, lbName, __cb(_, __frame, 2, 18, function ___(__0, __1) { lb = __1;

        self._showLoadBalancer(lb, resourceGroupName, lbName); _(); }, true)); }); },


  get: function get__5(resourceGroupName, lbName, _) { var self, progress, lb, __this = this; var __frame = { name: "get__5", line: 121 }; return __func(_, this, arguments, get__5, 2, __frame, function __$get__5() { self = __this;

      progress = self.interaction.progress(util.format($("Looking up the load balancer \"%s\""), lbName)); return (function ___(__then) { (function ___(_) { __tryCatch(_, function __$get__5() { return (function ___(__then) { (function ___(_) { __tryCatch(_, function __$get__5() {

                  return self.networkManagementClient.loadBalancers.get(resourceGroupName, lbName, __cb(_, __frame, 4, 58, function ___(__0, __1) { lb = __1;
                    return _(null, lb); }, true)); }); })(function ___(e, __result) { __catch(function __$get__5() { if (e) {

                    if ((e.statusCode === 404)) {
                      return _(null, null); } ;

                    return _(e); } else { _(null, __result); } ; }, _); }); })(function ___() { __tryCatch(_, function __$get__5() { _(null, null, true); }); }); }); })(function ___(__e, __r, __cont) { (function ___(__then) { __tryCatch(_, function __$get__5() {

              progress.end(); __then(); }); })(function ___() { __tryCatch(_, function ___() { if (__cont) { __then(); } else { _(__e, __r); }; }); }); }); })(function ___() { __tryCatch(_, function __$get__5() { _(); }); }); }); },



  delete: function delete__6(resourceGroupName, lbName, options, _) { var self, lb, progress, __this = this; var __frame = { name: "delete__6", line: 137 }; return __func(_, this, arguments, delete__6, 3, __frame, function __$delete__6() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __2) { lb = __2;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ; return (function __$delete__6(_) {


          var __1 = !options.quiet; if (!__1) { return _(null, __1); } ; return self.interaction.confirm(util.format($("Delete load balancer \"%s\"? [y/n] "), lbName), __cb(_, __frame, 8, 44, function ___(__0, __3) { var __2 = !__3; return _(null, __2); }, true)); })(__cb(_, __frame, -136, 17, function ___(__0, __3) { return (function __$delete__6(__then) { if (__3) { return _(null); } else { __then(); } ; })(function __$delete__6() {



            progress = self.interaction.progress(util.format($("Deleting load balancer \"%s\""), lbName)); return (function ___(__then) { (function ___(_) { __tryCatch(_, function __$delete__6() {

                  return self.networkManagementClient.loadBalancers.deleteMethod(resourceGroupName, lbName, __cb(_, __frame, 14, 49, function __$delete__6() { _(null, null, true); }, true)); }); })(function ___(__e, __r, __cont) { (function ___(__then) { __tryCatch(_, function __$delete__6() {

                    progress.end(); __then(); }); })(function ___() { __tryCatch(_, function ___() { if (__cont) { __then(); } else { _(__e, __r); }; }); }); }); })(function ___() { __tryCatch(_, function __$delete__6() { _(); }); }); }); }, true)); }, true)); }); },



  update: function update__7(resourceGroupName, lbName, parameters, _) { var self, progress, lb, __this = this; var __frame = { name: "update__7", line: 157 }; return __func(_, this, arguments, update__7, 3, __frame, function __$update__7() { self = __this;

      progress = self.interaction.progress(util.format($("Updating load balancer \"%s\""), lbName)); return (function ___(__then) { (function ___(_) { __tryCatch(_, function __$update__7() {

            return self.networkManagementClient.loadBalancers.createOrUpdate(resourceGroupName, lbName, parameters, __cb(_, __frame, 4, 58, function ___(__0, __1) { lb = __1;
              return _(null, lb); }, true)); }); })(function ___(__e, __r, __cont) { (function ___(__then) { __tryCatch(_, function __$update__7() {

              progress.end(); __then(); }); })(function ___() { __tryCatch(_, function ___() { if (__cont) { __then(); } else { _(__e, __r); }; }); }); }); })(function ___() { __tryCatch(_, function __$update__7() { _(); }); }); }); },






  createFrontendIP: function createFrontendIP__8(resourceGroupName, lbName, fipName, options, _) { var self, lb, fip, __this = this; var __frame = { name: "createFrontendIP__8", line: 171 }; return __func(_, this, arguments, createFrontendIP__8, 4, __frame, function __$createFrontendIP__8() { self = __this;


      if (((((!options.publicIpName && !options.publicIpId) && !options.subnetId) && !options.subnetName) && !options.subnetVnetName)) {
        return _(new Error($("You must specify --public-ip-id, --public-ip-name or --subnet-id, --subnet-name, --subnet-vnet-name"), lbName, resourceGroupName)); } ;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 7, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        fip = {
          name: fipName,
          privateIPAllocationMethod: "Dynamic" };


        return self._parseFrontendIP(resourceGroupName, fip, options, __cb(_, __frame, 17, 15, function ___(__0, __2) { fip = __2;

          if (utils.findFirstCaseIgnore(lb.frontendIPConfigurations, { name: fipName })) {
            return _(new Error(util.format($("Frontend IP configuration with name \"%s\" already exists in the load balancer \"%s\""), fipName, lbName))); } ;


          lb.frontendIPConfigurations.push(fip);

          return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 25, 14, function ___(__0, __3) { lb = __3;

            fip = utils.findFirstCaseIgnore(lb.frontendIPConfigurations, { name: fipName });
            self._showFrontendIP(fip); _(); }, true)); }, true)); }, true)); }); },


  setFrontendIP: function setFrontendIP__9(resourceGroupName, lbName, fipName, options, _) { var self, lb, fip, __this = this; var __frame = { name: "setFrontendIP__9", line: 202 }; return __func(_, this, arguments, setFrontendIP__9, 4, __frame, function __$setFrontendIP__9() { self = __this;

      return self.get(resourceGroupName, lbName, __cb(_, __frame, 2, 18, function ___(__0, __1) { lb = __1;

        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        fip = utils.findFirstCaseIgnore(lb.frontendIPConfigurations, { name: fipName });
        if (!fip) {
          return _(new Error(util.format($("Frontend IP configuration with name \"%s\" not found in the load balancer \"%s\""), fipName, lbName))); } ;


        return self._parseFrontendIP(resourceGroupName, fip, options, __cb(_, __frame, 13, 9, function __$setFrontendIP__9() {

          return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 15, 14, function ___(__0, __2) { lb = __2;

            fip = utils.findFirstCaseIgnore(lb.frontendIPConfigurations, { name: fipName });
            self._showFrontendIP(fip); _(); }, true)); }, true)); }, true)); }); },


  listFrontendIPs: function listFrontendIPs__10(resourceGroupName, lbName, options, _) { var self, lb, __this = this; var __frame = { name: "listFrontendIPs__10", line: 223 }; return __func(_, this, arguments, listFrontendIPs__10, 3, __frame, function __$listFrontendIPs__10() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        self.interaction.formatOutput(lb.frontendIPConfigurations, function(fips) {
          if ((fips.length === 0)) {
            self.output.warn($("No frontend IP configurations found")); }
           else {
            self._listFrontendIP(fips); } ; }); _(); }, true)); }); },




  deleteFrontendIP: function deleteFrontendIP__11(resourceGroupName, lbName, fipName, options, _) { var self, lb, index, __this = this; var __frame = { name: "deleteFrontendIP__11", line: 240 }; return __func(_, this, arguments, deleteFrontendIP__11, 4, __frame, function __$deleteFrontendIP__11() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __2) { lb = __2;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        index = utils.indexOfCaseIgnore(lb.frontendIPConfigurations, { name: fipName });
        if ((index === -1)) {
          return _(new Error(util.format($("Frontend IP configuration with name \"%s\" not found in the load balancer \"%s\""), fipName, lbName))); } ; return (function __$deleteFrontendIP__11(_) {


          var __1 = !options.quiet; if (!__1) { return _(null, __1); } ; return self.interaction.confirm(util.format($("Delete frontend IP configuration \"%s\" ? [y/n] "), fipName), __cb(_, __frame, 13, 44, function ___(__0, __3) { var __2 = !__3; return _(null, __2); }, true)); })(__cb(_, __frame, -239, 17, function ___(__0, __3) { return (function __$deleteFrontendIP__11(__then) { if (__3) { return _(null); } else { __then(); } ; })(function __$deleteFrontendIP__11() {



            lb.frontendIPConfigurations.splice(index, 1);
            return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 18, 9, function __$deleteFrontendIP__11() { _(); }, true)); }); }, true)); }, true)); }); },





  createProbe: function createProbe__12(resourceGroupName, lbName, probeName, options, _) { var self, probe, lb, __this = this; var __frame = { name: "createProbe__12", line: 264 }; return __func(_, this, arguments, createProbe__12, 4, __frame, function __$createProbe__12() { self = __this;


      probe = {
        name: probeName };


      probe = self._parseProbe(probe, options, true);

      return self.get(resourceGroupName, lbName, __cb(_, __frame, 9, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        if (utils.findFirstCaseIgnore(lb.probes, { name: probeName })) {
          return _(new Error(util.format($("A probe with name \"%s\" already exists in the load balancer \"%s\""), probeName, lbName))); } ;


        lb.probes.push(probe);
        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 19, 14, function ___(__0, __2) { lb = __2;

          probe = utils.findFirstCaseIgnore(lb.probes, { name: probeName });
          self._showProbe(probe); _(); }, true)); }, true)); }); },


  setProbe: function setProbe__13(resourceGroupName, lbName, probeName, options, _) { var self, lb, probe, __this = this; var __frame = { name: "setProbe__13", line: 289 }; return __func(_, this, arguments, setProbe__13, 4, __frame, function __$setProbe__13() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        probe = utils.findFirstCaseIgnore(lb.probes, {
          name: probeName });

        if (!probe) {
          return _(new Error(util.format($("A probe with name \"%s\" not found in the load balancer \"%s\""), probeName, lbName))); } ;


        self._parseProbe(probe, options, false);

        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 17, 14, function ___(__0, __2) { lb = __2;

          probe = utils.findFirstCaseIgnore(lb.probes, { name: probeName });
          self._showProbe(probe); _(); }, true)); }, true)); }); },


  listProbes: function listProbes__14(resourceGroupName, lbName, options, _) { var self, lb, __this = this; var __frame = { name: "listProbes__14", line: 312 }; return __func(_, this, arguments, listProbes__14, 3, __frame, function __$listProbes__14() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        self.interaction.formatOutput(lb.probes, function(probes) {
          if ((probes.length === 0)) {
            self.output.warn($("No probes found")); }
           else {
            self._listProbes(probes); } ; }); _(); }, true)); }); },




  deleteProbe: function deleteProbe__15(resourceGroupName, lbName, probeName, options, _) { var self, lb, index, __this = this; var __frame = { name: "deleteProbe__15", line: 329 }; return __func(_, this, arguments, deleteProbe__15, 4, __frame, function __$deleteProbe__15() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __2) { lb = __2;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        index = utils.indexOfCaseIgnore(lb.probes, { name: probeName });
        if ((index === -1)) {
          return _(new Error(util.format($("A probe with name with name \"%s\" not found in the load balancer \"%s\""), probeName, lbName))); } ; return (function __$deleteProbe__15(_) {


          var __1 = !options.quiet; if (!__1) { return _(null, __1); } ; return self.interaction.confirm(util.format($("Delete probe \"%s\" ? [y/n] "), probeName), __cb(_, __frame, 13, 44, function ___(__0, __3) { var __2 = !__3; return _(null, __2); }, true)); })(__cb(_, __frame, -328, 17, function ___(__0, __3) { return (function __$deleteProbe__15(__then) { if (__3) { return _(null); } else { __then(); } ; })(function __$deleteProbe__15() {



            lb.probes.splice(index, 1);
            return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 18, 9, function __$deleteProbe__15() { _(); }, true)); }); }, true)); }, true)); }); },





  createBackendAddressPool: function createBackendAddressPool__16(resourceGroupName, lbName, poolName, options, _) { var self, pool, lb, __this = this; var __frame = { name: "createBackendAddressPool__16", line: 353 }; return __func(_, this, arguments, createBackendAddressPool__16, 4, __frame, function __$createBackendAddressPool__16() { self = __this;


      pool = {
        name: poolName,
        properties: { } };


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 8, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        if (utils.findFirstCaseIgnore(lb.backendAddressPools, { name: poolName })) {
          return _(new Error(util.format($("A backend address pool with name \"%s\" already exists in the load balancer \"%s\""), poolName, lbName))); } ;


        lb.backendAddressPools.push(pool);
        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 18, 14, function ___(__0, __2) { lb = __2;

          pool = utils.findFirstCaseIgnore(lb.backendAddressPools, { name: poolName });
          self._showBackendAddressPool(pool); _(); }, true)); }, true)); }); },


  listBackendAddressPools: function listBackendAddressPools__17(resourceGroupName, lbName, options, _) { var self, lb, __this = this; var __frame = { name: "listBackendAddressPools__17", line: 377 }; return __func(_, this, arguments, listBackendAddressPools__17, 3, __frame, function __$listBackendAddressPools__17() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        self.interaction.formatOutput(lb.backendAddressPools, function(pools) {
          if ((pools.length === 0)) {
            self.output.warn($("No backend address pools found")); }
           else {
            self._listBackendAddressPools(pools); } ; }); _(); }, true)); }); },




  deleteBackendAddressPool: function deleteBackendAddressPool__18(resourceGroupName, lbName, poolName, options, _) { var self, lb, index, __this = this; var __frame = { name: "deleteBackendAddressPool__18", line: 394 }; return __func(_, this, arguments, deleteBackendAddressPool__18, 4, __frame, function __$deleteBackendAddressPool__18() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __2) { lb = __2;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        index = utils.indexOfCaseIgnore(lb.backendAddressPools, { name: poolName });
        if ((index === -1)) {
          return _(new Error(util.format($("A backend address pool with name with name \"%s\" not found in the load balancer \"%s\""), poolName, lbName))); } ; return (function __$deleteBackendAddressPool__18(_) {


          var __1 = !options.quiet; if (!__1) { return _(null, __1); } ; return self.interaction.confirm(util.format($("Delete backend address pool \"%s\" ? [y/n] "), poolName), __cb(_, __frame, 13, 44, function ___(__0, __3) { var __2 = !__3; return _(null, __2); }, true)); })(__cb(_, __frame, -393, 17, function ___(__0, __3) { return (function __$deleteBackendAddressPool__18(__then) { if (__3) { return _(null); } else { __then(); } ; })(function __$deleteBackendAddressPool__18() {



            lb.backendAddressPools.splice(index, 1);
            return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 18, 9, function __$deleteBackendAddressPool__18() { _(); }, true)); }); }, true)); }, true)); }); },





  createBalancingRule: function createBalancingRule__19(resourceGroupName, lbName, ruleName, options, _) { var self, rule, lb, __this = this; var __frame = { name: "createBalancingRule__19", line: 418 }; return __func(_, this, arguments, createBalancingRule__19, 4, __frame, function __$createBalancingRule__19() { self = __this;


      rule = {
        name: ruleName };


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 7, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        rule = self._parseBalancingRule(lb, rule, options, true);

        if (utils.findFirstCaseIgnore(lb.loadBalancingRules, { name: ruleName })) {
          return _(new Error(util.format($("Load balancing rule with name \"%s\" already exists in the load balancer \"%s\""), ruleName, lbName))); } ;


        lb.loadBalancingRules.push(rule);
        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 19, 14, function ___(__0, __2) { lb = __2;

          rule = utils.findFirstCaseIgnore(lb.loadBalancingRules, { name: ruleName });
          self._showBalancingRule(rule); _(); }, true)); }, true)); }); },


  setBalancingRule: function setBalancingRule__20(resourceGroupName, lbName, ruleName, options, _) { var self, lb, rule, __this = this; var __frame = { name: "setBalancingRule__20", line: 443 }; return __func(_, this, arguments, setBalancingRule__20, 4, __frame, function __$setBalancingRule__20() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        rule = utils.findFirstCaseIgnore(lb.loadBalancingRules, { name: ruleName });
        if (!rule) {
          return _(new Error(util.format($("Load balancing rule with the name \"%s\" not found in load balancer \"%s\""), ruleName, lbName))); } ;


        self._parseBalancingRule(lb, rule, options, false);
        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 14, 14, function ___(__0, __2) { lb = __2;

          rule = utils.findFirstCaseIgnore(lb.loadBalancingRules, { name: ruleName });
          self._showBalancingRule(rule); _(); }, true)); }, true)); }); },


  listBalancingRules: function listBalancingRules__21(resourceGroupName, lbName, options, _) { var self, lb, __this = this; var __frame = { name: "listBalancingRules__21", line: 463 }; return __func(_, this, arguments, listBalancingRules__21, 3, __frame, function __$listBalancingRules__21() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        self.interaction.formatOutput(lb.loadBalancingRules, function(rules) {
          if ((rules.length === 0)) {
            self.output.warn($("No load balancing rules found")); }
           else {
            self._listBalancingRules(rules); } ; }); _(); }, true)); }); },




  deleteBalancingRule: function deleteBalancingRule__22(resourceGroupName, lbName, ruleName, options, _) { var self, lb, index, __this = this; var __frame = { name: "deleteBalancingRule__22", line: 480 }; return __func(_, this, arguments, deleteBalancingRule__22, 4, __frame, function __$deleteBalancingRule__22() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __2) { lb = __2;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        index = utils.indexOfCaseIgnore(lb.loadBalancingRules, { name: ruleName });
        if ((index === -1)) {
          return _(new Error(util.format($("A load balancing rule with name \"%s\" not found in the load balancer \"%s\""), ruleName, lbName))); } ; return (function __$deleteBalancingRule__22(_) {


          var __1 = !options.quiet; if (!__1) { return _(null, __1); } ; return self.interaction.confirm(util.format($("Delete load balancing rule \"%s\" ? [y/n] "), ruleName), __cb(_, __frame, 13, 44, function ___(__0, __3) { var __2 = !__3; return _(null, __2); }, true)); })(__cb(_, __frame, -479, 17, function ___(__0, __3) { return (function __$deleteBalancingRule__22(__then) { if (__3) { return _(null); } else { __then(); } ; })(function __$deleteBalancingRule__22() {



            lb.loadBalancingRules.splice(index, 1);
            return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 18, 9, function __$deleteBalancingRule__22() { _(); }, true)); }); }, true)); }, true)); }); },





  createInboundNatRule: function createInboundNatRule__23(resourceGroupName, lbName, ruleName, options, _) { var self, lb, rule, __this = this; var __frame = { name: "createInboundNatRule__23", line: 504 }; return __func(_, this, arguments, createInboundNatRule__23, 4, __frame, function __$createInboundNatRule__23() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        rule = {
          name: ruleName };


        rule = self._parseInboundNatRule(lb, rule, options, true);

        if (utils.findFirstCaseIgnore(lb.inboundNatRules, { name: ruleName })) {
          return _(new Error(util.format($("An inbound NAT rule with name \"%s\" already exists in the load balancer \"%s\""), ruleName, lbName))); } ;


        lb.inboundNatRules.push(rule);
        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 19, 14, function ___(__0, __2) { lb = __2;

          rule = utils.findFirstCaseIgnore(lb.inboundNatRules, { name: ruleName });
          self._showInboundNatRule(rule); _(); }, true)); }, true)); }); },


  setInboundNatRule: function setInboundNatRule__24(resourceGroupName, lbName, ruleName, options, _) { var self, lb, rule, __this = this; var __frame = { name: "setInboundNatRule__24", line: 529 }; return __func(_, this, arguments, setInboundNatRule__24, 4, __frame, function __$setInboundNatRule__24() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        rule = utils.findFirstCaseIgnore(lb.inboundNatRules, { name: ruleName });
        if (!rule) {
          return _(new Error(util.format($("An inbound NAT rule with name \"%s\" not found in the load balancer \"%s\""), ruleName, lbName))); } ;


        self._parseInboundNatRule(lb, rule, options, false);
        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 14, 14, function ___(__0, __2) { lb = __2;

          rule = utils.findFirstCaseIgnore(lb.inboundNatRules, { name: ruleName });
          self._showInboundNatRule(rule); _(); }, true)); }, true)); }); },


  listInboundNatRules: function listInboundNatRules__25(resourceGroupName, lbName, options, _) { var self, lb, __this = this; var __frame = { name: "listInboundNatRules__25", line: 549 }; return __func(_, this, arguments, listInboundNatRules__25, 3, __frame, function __$listInboundNatRules__25() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        self.interaction.formatOutput(lb.inboundNatRules, function(inboundNatRules) {
          if ((inboundNatRules.length === 0)) {
            self.output.warn($("No inbound NAT rules found")); }
           else {
            self._listInboundNatRules(inboundNatRules); } ; }); _(); }, true)); }); },




  deleteInboundNatRule: function deleteInboundNatRule__26(resourceGroupName, lbName, ruleName, options, _) { var self, lb, ruleIndex, __this = this; var __frame = { name: "deleteInboundNatRule__26", line: 566 }; return __func(_, this, arguments, deleteInboundNatRule__26, 4, __frame, function __$deleteInboundNatRule__26() { self = __this;

      return self.get(resourceGroupName, lbName, __cb(_, __frame, 2, 18, function ___(__0, __2) { lb = __2;

        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        ruleIndex = utils.indexOfCaseIgnore(lb.inboundNatRules, { name: ruleName });
        if ((ruleIndex === -1)) {
          return _(new Error(util.format($("An inbound NAT rule with name \"%s\" not found in the load balancer \"%s\""), ruleName, lbName))); } ; return (function __$deleteInboundNatRule__26(_) {


          var __1 = !options.quiet; if (!__1) { return _(null, __1); } ; return self.interaction.confirm(util.format($("Delete inbound NAT rule \"%s\" ? [y/n] "), ruleName), __cb(_, __frame, 13, 44, function ___(__0, __3) { var __2 = !__3; return _(null, __2); }, true)); })(__cb(_, __frame, -565, 17, function ___(__0, __3) { return (function __$deleteInboundNatRule__26(__then) { if (__3) { return _(null); } else { __then(); } ; })(function __$deleteInboundNatRule__26() {



            lb.inboundNatRules.splice(ruleIndex, 1);
            return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 18, 9, function __$deleteInboundNatRule__26() { _(); }, true)); }); }, true)); }, true)); }); },





  createInboundNatPool: function createInboundNatPool__27(resourceGroupName, lbName, poolName, options, _) { var self, lb, pool, __this = this; var __frame = { name: "createInboundNatPool__27", line: 590 }; return __func(_, this, arguments, createInboundNatPool__27, 4, __frame, function __$createInboundNatPool__27() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        pool = {
          name: poolName };

        pool = self._parseInboundNatPool(lb, pool, options, true);

        if (utils.findFirstCaseIgnore(lb.inboundNatPools, { name: poolName })) {
          return _(new Error(util.format($("An inbound NAT pool with name \"%s\" already exists in the load balancer \"%s\""), poolName, lbName))); } ;


        lb.inboundNatPools.push(pool);

        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 19, 14, function ___(__0, __2) { lb = __2;

          pool = utils.findFirstCaseIgnore(lb.inboundNatPools, { name: poolName });
          self._showInboundNatPool(pool); _(); }, true)); }, true)); }); },


  setInboundNatPool: function setInboundNatPool__28(resourceGroupName, lbName, poolName, options, _) { var self, lb, pool, __this = this; var __frame = { name: "setInboundNatPool__28", line: 615 }; return __func(_, this, arguments, setInboundNatPool__28, 4, __frame, function __$setInboundNatPool__28() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        pool = utils.findFirstCaseIgnore(lb.inboundNatPools, { name: poolName });
        if (!pool) {
          return _(new Error(util.format($("An inbound NAT pool with name \"%s\" not found in the load balancer \"%s\""), poolName, lbName))); } ;


        self._parseInboundNatPool(lb, pool, options, false);
        return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 14, 14, function ___(__0, __2) { lb = __2;

          pool = utils.findFirstCaseIgnore(lb.inboundNatPools, { name: poolName });
          self._showInboundNatPool(pool); _(); }, true)); }, true)); }); },


  listInboundNatPools: function listInboundNatPools__29(resourceGroupName, lbName, options, _) { var self, lb, __this = this; var __frame = { name: "listInboundNatPools__29", line: 635 }; return __func(_, this, arguments, listInboundNatPools__29, 3, __frame, function __$listInboundNatPools__29() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __1) { lb = __1;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        self.interaction.formatOutput(lb.inboundNatPools, function(inboundNatPools) {
          if ((inboundNatPools.length === 0)) {
            self.output.warn($("No inbound NAT pools found")); }
           else {
            self._listInboundNatPools(inboundNatPools); } ; }); _(); }, true)); }); },




  deleteInboundNatPool: function deleteInboundNatPool__30(resourceGroupName, lbName, poolName, options, _) { var self, lb, index, __this = this; var __frame = { name: "deleteInboundNatPool__30", line: 652 }; return __func(_, this, arguments, deleteInboundNatPool__30, 4, __frame, function __$deleteInboundNatPool__30() { self = __this;


      return self.get(resourceGroupName, lbName, __cb(_, __frame, 3, 18, function ___(__0, __2) { lb = __2;
        if (!lb) {
          return _(new Error(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName))); } ;


        index = utils.indexOfCaseIgnore(lb.inboundNatPools, { name: poolName });
        if ((index === -1)) {
          return _(new Error(util.format($("An inbound NAT pool with name \"%s\" not found in the load balancer \"%s\""), poolName, lbName))); } ; return (function __$deleteInboundNatPool__30(_) {


          var __1 = !options.quiet; if (!__1) { return _(null, __1); } ; return self.interaction.confirm(util.format($("Delete inbound NAT pool \"%s\" ? [y/n] "), poolName), __cb(_, __frame, 13, 44, function ___(__0, __3) { var __2 = !__3; return _(null, __2); }, true)); })(__cb(_, __frame, -651, 17, function ___(__0, __3) { return (function __$deleteInboundNatPool__30(__then) { if (__3) { return _(null); } else { __then(); } ; })(function __$deleteInboundNatPool__30() {



            lb.inboundNatPools.splice(index, 1);
            return self.update(resourceGroupName, lbName, lb, __cb(_, __frame, 18, 9, function __$deleteInboundNatPool__30() { _(); }, true)); }); }, true)); }, true)); }); },





  _parseLoadBalancer: function(lb, options) {
    if (options.tags) {
      if (utils.argHasValue(options.tags)) {
        tagUtils.appendTags(lb, options); }
       else {
        lb.tags = { }; } ; } ;



    return lb; },


  _parseFrontendIP: function _parseFrontendIP__31(resourceGroupName, fip, options, _) { var self, publicip, subnet, __this = this; var __frame = { name: "_parseFrontendIP__31", line: 688 }; return __func(_, this, arguments, _parseFrontendIP__31, 3, __frame, function __$_parseFrontendIP__31() { self = __this;


      if (options.privateIpAddress) {
        if (utils.argHasValue(options.privateIpAddress)) {
          fip.privateIPAddress = validation.isIP(options.privateIpAddress, "--private-ip-address");
          fip.privateIPAllocationMethod = "Static"; }
         else {
          delete fip.privateIPAddress;
          fip.privateIPAllocationMethod = "Dynamic"; } ; } ; return (function __$_parseFrontendIP__31(__then) {



        if (options.publicIpId) {
          if (options.publicIpName) { self.output.warn($("--public-ip-name parameter will be ignored because --public-ip-id and --public-ip-name are mutually exclusive")); } ;
          fip.publicIPAddress = {
            id: options.publicIpId };

          delete fip.subnet; __then(); } else { return (function __$_parseFrontendIP__31(__then) {
            if (options.publicIpName) {
              return self.publicIpCrud.get(resourceGroupName, options.publicIpName, __cb(_, __frame, 20, 39, function ___(__0, __1) { publicip = __1;
                if (!publicip) {
                  return _(new Error(util.format($("A public ip address with name \"%s\" not found in the resource group \"%s\""), options.publicIpName, resourceGroupName))); } ;

                fip.publicIPAddress = {
                  id: publicip.id };

                delete fip.subnet; __then(); }, true)); } else { __then(); } ; })(__then); } ; })(function __$_parseFrontendIP__31() { return (function __$_parseFrontendIP__31(__then) {


          if (options.subnetId) {
            if ((options.subnetName || options.subnetVnetName)) { self.output.warn($("--subnet-name, --subnet-vnet-name parameter will be ignored because --subnet-name, --subnet-vnet-name and --subnet-id are mutually exclusive")); } ;
            fip.subnet = {
              id: options.subnetId };

            delete fip.publicIPAddress; __then(); } else { return (function __$_parseFrontendIP__31(__then) {
              if ((options.subnetName && options.subnetVnetName)) {
                return self.subnetCrud.get(resourceGroupName, options.subnetVnetName, options.subnetName, __cb(_, __frame, 37, 35, function ___(__0, __2) { subnet = __2;
                  if (!subnet) {
                    return _(new Error(util.format($("A subnet with name \"%s\" not found in the resource group \"%s\""), options.subnetName, resourceGroupName))); } ;

                  fip.subnet = {
                    id: subnet.id };

                  delete fip.publicIPAddress; __then(); }, true)); } else { __then(); } ; })(__then); } ; })(function __$_parseFrontendIP__31() {


          return _(null, fip); }); }); }); },


  _parseProbe: function(probe, options, useDefaults) {
    var self = this;

    if (options.path) {
      if (utils.stringIsNullOrEmpty(options.path)) {
        throw new Error($("--path must not be null or empty string")); } ;

      probe.requestPath = options.path; } ;


    if (options.protocol) {
      validation.isIn(options.protocol, constants.lb.probe.protocols, "--protocol");

      if (utils.ignoreCaseEquals(options.protocol, "tcp")) {
        if (options.path) {
          self.output.warn($("--path will be ignored when probe protocol is TCP")); } ;

        delete probe.requestPath; } ;


      if ((utils.ignoreCaseEquals(options.protocol, "http") && !options.path)) {
        throw new Error($("--path is required when probe protocol is HTTP")); } ;


      probe.protocol = options.protocol; }
     else if (useDefaults) {
      probe.protocol = utils.takeDefault(self.output, constants.lb.defProtocol, "--protocol"); }  ;


    if (options.port) {
      probe.port = validation.isInt(options.port, constants.lb.port, "--port"); }
     else if (useDefaults) {
      probe.port = utils.takeDefault(self.output, constants.lb.defPort, "--port"); }  ;


    if (options.interval) {
      probe.intervalInSeconds = validation.isInt(options.interval, constants.lb.probe.interval, "--interval"); } ;


    if (options.count) {
      probe.numberOfProbes = validation.isInt(options.count, { }, "--count"); } ;


    return probe; },


  _parseBalancingRule: function(lb, rule, options, useDefaults) {
    var self = this;

    if (options.protocol) {
      rule.protocol = validation.isIn(options.protocol, constants.lb.protocols, "--protocol"); }
     else if (useDefaults) {
      rule.protocol = utils.takeDefault(self.output, constants.lb.defProtocol, "--protocol"); }  ;


    if (options.frontendPort) {
      rule.frontendPort = validation.isInt(options.frontendPort, constants.lb.port, "--frontend-port"); }
     else if (useDefaults) {
      rule.frontendPort = utils.takeDefault(self.output, constants.lb.defPort, "--frontend-port"); }  ;


    if (options.backendPort) {
      rule.backendPort = validation.isInt(options.backendPort, constants.lb.port, "--backend-port"); }
     else if (useDefaults) {
      rule.backendPort = utils.takeDefault(self.output, constants.lb.defPort, "--backend-port"); }  ;


    if (options.idleTimeout) {
      rule.idleTimeoutInMinutes = validation.isInt(options.idleTimeout, { }, "--idle-timeout"); }
     else if (useDefaults) {
      rule.idleTimeoutInMinutes = utils.takeDefault(self.output, constants.lb.defTimeout, "--idle-timeout"); }  ;


    if (options.enableFloatingIp) {
      rule.enableFloatingIP = validation.isBool(options.enableFloatingIp, "--enable-floating-ip"); }
     else if (useDefaults) {
      rule.enableFloatingIP = utils.takeDefault(self.output, constants.lb.defFloatingIp, "--enable-floating-ip"); }  ;


    if (options.backendAddressPoolName) {
      var pool = utils.findFirstCaseIgnore(lb.backendAddressPools, {
        name: options.backendAddressPoolName });

      if (!pool) {
        throw new Error(util.format($("Backend address pool with name \"%s\" not found in the load balancer \"%s\""), options.backendAddressPoolName, lb.name)); } ;

      rule.backendAddressPool = {
        id: pool.id }; }

     else if (useDefaults) {
      if ((lb.backendAddressPools.length === 0)) {
        throw new Error($("Load balancer must have at least one backend address pool if --backend-address-pool--name parameter is not specified.")); } ;

      var defPool = lb.backendAddressPools[0];
      self.output.warn(util.format($("Using backend address pool: %s"), defPool.name));
      rule.backendAddressPool = {
        id: defPool.id }; }  ;



    if (options.frontendIpName) {
      var fip = utils.findFirstCaseIgnore(lb.frontendIPConfigurations, {
        name: options.frontendIpName });

      if (!fip) {
        throw new Error(util.format($("Frontend IP configuration with name \"%s\" not found in the load balancer \"%s\""), options.frontendIpName, lb.name)); } ;

      rule.frontendIPConfiguration = {
        id: fip.id }; }

     else if (useDefaults) {
      if ((lb.frontendIPConfigurations.length === 0)) {
        throw new Error($("Load balancer must have at least one frontend IP configuration if --frontend-ip-name parameter is not specified.")); } ;

      var defFip = lb.frontendIPConfigurations[0];
      self.output.warn(util.format($("Using frontend IP configuration: %s"), defFip.name));
      rule.frontendIPConfiguration = {
        id: defFip.id }; }  ;



    if (options.loadDistribution) {
      rule.loadDistribution = validation.isIn(options.loadDistribution, constants.lb.distribution, "--load-distribution"); }
     else if (useDefaults) {
      rule.loadDistribution = utils.takeDefault(self.output, constants.lb.distribution[0], "--load-distribution"); }  ;


    if (options.probeName) {
      if (utils.argHasValue(options.probeName)) {
        if ((lb.probes.length === 0)) {
          throw new Error(util.format($("No probes found for the load balancer \"%s\""), lb.name)); } ;

        var probe = utils.findFirstCaseIgnore(lb.probes, {
          name: options.probeName });

        if (!probe) {
          throw new Error(util.format($("Probe with name \"%s\" not found in the load balancer \"%s\""), options.probeName, lb.name)); } ;

        rule.probe = {
          id: probe.id }; }

       else {
        delete rule.probe; } ; } ;



    return rule; },


  _parseInboundNatRule: function(lb, rule, options, useDefaults) {
    var self = this;

    if (options.protocol) {
      rule.protocol = validation.isIn(options.protocol, constants.lb.protocols, "--protocol"); }
     else if (useDefaults) {
      rule.protocol = utils.takeDefault(self.output, constants.lb.defProtocol, "--protocol"); }  ;


    if (options.frontendPort) {
      rule.frontendPort = validation.isInt(options.frontendPort, constants.lb.port, "--frontend-port"); }
     else if (useDefaults) {
      rule.frontendPort = utils.takeDefault(self.output, constants.lb.defPort, "--frontend-port"); }  ;


    if (options.backendPort) {
      rule.backendPort = validation.isInt(options.backendPort, constants.lb.port, "--backend-port"); }
     else if (useDefaults) {
      rule.backendPort = utils.takeDefault(self.output, constants.lb.defPort, "--backend-port"); }  ;


    if (options.enableFloatingIp) {
      rule.enableFloatingIP = validation.isBool(options.enableFloatingIp, "--enable-floating-ip"); }
     else if (useDefaults) {
      rule.enableFloatingIP = utils.takeDefault(self.output, constants.lb.defFloatingIp, "--enable-floating-ip"); }  ;


    if (options.idleTimeout) {
      rule.idleTimeoutInMinutes = validation.isInt(options.idleTimeout, { }, "--idle-timeout"); }
     else if (useDefaults) {
      rule.idleTimeoutInMinutes = utils.takeDefault(self.output, constants.lb.defTimeout, "--idle-timeout"); }  ;


    if (options.frontendIpName) {
      var fip = utils.findFirstCaseIgnore(lb.frontendIPConfigurations, {
        name: options.frontendIpName });

      if (!fip) {
        throw new Error(util.format($("Frontend IP configuration with name \"%s\" not found in the load balancer \"%s\""), options.frontendIpName, lb.name)); } ;

      rule.frontendIPConfiguration = {
        id: fip.id }; }

     else if (useDefaults) {
      if ((lb.frontendIPConfigurations.length === 0)) {
        throw new Error(util.format($("Load balancer \"%s\" has no frontend IP configurations defined"), lb.name)); } ;

      var defFip = lb.frontendIPConfigurations[0];
      self.output.warn(util.format($("Using default frontend IP configuration \"%s\""), defFip.name));
      rule.frontendIPConfiguration = {
        id: defFip.id }; }  ;



    return rule; },


  _parseInboundNatPool: function(lb, pool, options, useDefaults) {
    var self = this;

    if (options.protocol) {
      pool.protocol = validation.isIn(options.protocol, constants.lb.protocols, "--protocol"); }
     else if (useDefaults) {
      pool.protocol = utils.takeDefault(self.output, constants.lb.defProtocol, "--protocol"); }  ;


    if (options.frontendPortRangeStart) {
      pool.frontendPortRangeStart = validation.isInt(options.frontendPortRangeStart, constants.lb.port, "--frontend-port-range-start"); }
     else if (useDefaults) {
      pool.frontendPortRangeStart = utils.takeDefault(self.output, constants.portBounds[0], "--frontend-port-range-start"); }  ;


    if (options.frontendPortRangeEnd) {
      pool.frontendPortRangeEnd = validation.isInt(options.frontendPortRangeEnd, constants.lb.port, "--frontend-port-range-end"); }
     else if (useDefaults) {
      pool.frontendPortRangeEnd = utils.takeDefault(self.output, constants.portBounds[1], "--frontend-port-range-end"); }  ;


    if ((options.frontendPortRangeStart && options.frontendPortRangeEnd)) {
      if ((options.frontendPortRangeStart > options.frontendPortRangeEnd)) {
        throw new Error($("The --frontend-port-range-start should be less or equal to --frontend-port-range-end")); } ; } ;



    if (options.backendPort) {
      pool.backendPort = validation.isInt(options.backendPort, constants.lb.port, "--backend-port"); }
     else if (useDefaults) {
      pool.backendPort = utils.takeDefault(self.output, constants.lb.defPort, "--backend-port"); }  ;


    if (options.frontendIpName) {
      var fip = utils.findFirstCaseIgnore(lb.frontendIPConfigurations, { name: options.frontendIpName });
      if (!fip) {
        throw new Error(util.format($("Frontend IP configuration with name \"%s\" not found in load balancer \"%s\""), options.frontendIpName, lb.name)); } ;

      pool.frontendIPConfiguration = {
        id: fip.id }; }

     else if (useDefaults) {
      if ((lb.frontendIPConfigurations.length === 0)) {
        throw new Error(util.format($("Load balancer with name \"%s\" has no frontend IP configurations defined"), lb.name)); } ;

      var defFip = lb.frontendIPConfigurations[0];
      self.output.warn(util.format($("Using default frontend IP configuration \"%s\""), defFip.name));
      pool.frontendIPConfiguration = {
        id: defFip.id }; }  ;



    return pool; },


  _showLoadBalancer: function(lb, resourceGroupName, lbName) {
    var self = this;

    self.interaction.formatOutput(lb, function(lb) {
      if ((lb === null)) {
        self.output.warn(util.format($("A load balancer with name \"%s\" not found in the resource group \"%s\""), lbName, resourceGroupName));
        return; } ;


      self.output.nameValue($("Id"), lb.id);
      self.output.nameValue($("Name"), lb.name);
      self.output.nameValue($("Type"), lb.type);
      self.output.nameValue($("Location"), lb.location);
      self.output.nameValue($("Provisioning state"), lb.provisioningState);
      self.output.nameValue($("Tags"), tagUtils.getTagsInfo(lb.tags));
      if ((lb.frontendIPConfigurations.length > 0)) {
        self.output.data("");
        self.output.header($("Frontend IP configurations"));
        self._listFrontendIP(lb.frontendIPConfigurations); } ;

      if ((lb.probes.length > 0)) {
        self.output.data("");
        self.output.header($("Probes"));
        self._listProbes(lb.probes); } ;

      if ((lb.backendAddressPools.length > 0)) {
        self.output.data("");
        self.output.header($("Backend Address Pools"));
        self._listBackendAddressPools(lb.backendAddressPools); } ;

      if ((lb.loadBalancingRules.length > 0)) {
        self.output.data("");
        self.output.header($("Load Balancing Rules"));
        self._listBalancingRules(lb.loadBalancingRules); } ;

      if ((lb.inboundNatRules.length > 0)) {
        self.output.data("");
        self.output.header($("Inbound NAT Rules"));
        self._listInboundNatRules(lb.inboundNatRules); } ;

      if ((lb.inboundNatPools.length > 0)) {
        self.output.data("");
        self.output.header($("Inbound NAT Pools"));
        self._listInboundNatPools(lb.inboundNatPools); } ; }); },




  _showFrontendIP: function(fip) {
    var self = this;
    self.interaction.formatOutput(fip, function(fip) {
      self.output.nameValue("Name", fip.name);
      self.output.nameValue("Provisioning state", fip.provisioningState);
      self.output.nameValue("Private IP allocation method", fip.privateIPAllocationMethod);
      self.output.nameValue("Private IP address", fip.privateIPAddress);
      if (fip.publicIPAddress) {
        self.output.nameValue("Public IP address id", fip.publicIPAddress.id); } ;

      if (fip.subnet) {
        self.output.nameValue($("Subnet id"), fip.subnet.id); } ; }); },




  _showProbe: function(probe) {
    var self = this;
    self.interaction.formatOutput(probe, function(probe) {
      self.output.nameValue($("Name"), probe.name);
      self.output.nameValue($("Provisioning state"), probe.provisioningState);
      self.output.nameValue($("Protocol"), probe.protocol);
      self.output.nameValue($("Port"), probe.port);
      self.output.nameValue($("Interval in seconds"), probe.intervalInSeconds);
      self.output.nameValue($("Number of probes"), probe.numberOfProbes);
      if (!__.isEmpty(probe.loadBalancingRules)) {
        self.output.header($("Load balancing rules"));
        probe.loadBalancingRules.forEach(function(rule) {
          self.output.listItem(rule.id); }); } ; }); },





  _showBackendAddressPool: function(pool) {
    var self = this;

    self.interaction.formatOutput(pool, function(pool) {
      self.output.nameValue($("Name"), pool.name);
      self.output.nameValue($("Provisioning state"), pool.provisioningState);
      if (!__.isEmpty(pool.backendIPConfigurations)) {
        self.output.header($("Backend IP configurations"));
        pool.backendIPConfigurations.forEach(function(ipConfig) {
          self.output.listItem(ipConfig.id); }); } ; }); },





  _showBalancingRule: function(rule) {
    var self = this;
    self.interaction.formatOutput(rule, function(rule) {
      self.output.nameValue($("Name"), rule.name);
      self.output.nameValue($("Provisioning state"), rule.provisioningState);
      self.output.nameValue($("Protocol"), rule.protocol);
      self.output.nameValue($("Frontend port"), rule.frontendPort);
      self.output.nameValue($("Backend port"), rule.backendPort);
      self.output.nameValue($("Enable floating IP"), rule.enableFloatingIP.toString());
      self.output.nameValue($("Load distribution"), rule.loadDistribution);
      self.output.nameValue($("Idle timeout in minutes"), rule.idleTimeoutInMinutes);
      if (rule.frontendIPConfiguration) {
        self.output.nameValue($("Frontend IP configuration id"), rule.frontendIPConfiguration.id); } ;

      if (rule.backendAddressPool) {
        self.output.nameValue($("Backend address pool id"), rule.backendAddressPool.id); } ;

      if (rule.probe) {
        self.output.nameValue($("Probe id"), rule.probe.id); } ; }); },




  _showInboundNatRule: function(rule) {
    var self = this;
    self.interaction.formatOutput(rule, function(rule) {
      self.output.nameValue($("Name"), rule.name);
      self.output.nameValue($("Provisioning state"), rule.provisioningState);
      self.output.nameValue($("Protocol"), rule.protocol);
      self.output.nameValue($("Frontend port"), rule.frontendPort);
      self.output.nameValue($("Backend port"), rule.backendPort);
      self.output.nameValue($("Enable floating IP"), rule.enableFloatingIP.toString());
      self.output.nameValue($("Idle timeout in minutes"), rule.idleTimeoutInMinutes);
      if (rule.frontendIPConfiguration) {
        self.output.nameValue($("Frontend IP configuration id"), rule.frontendIPConfiguration.id); } ;

      if (rule.backendIPConfiguration) {
        self.output.nameValue($("Backend IP Configuration id"), rule.backendIPConfiguration.id); } ; }); },




  _showInboundNatPool: function(pool) {
    var self = this;
    self.interaction.formatOutput(pool, function(pool) {
      self.output.nameValue($("Name"), pool.name);
      self.output.nameValue($("Provisioning state"), pool.provisioningState);
      self.output.nameValue($("Protocol"), pool.protocol);
      self.output.nameValue($("Frontend port range start"), pool.frontendPortRangeStart);
      self.output.nameValue($("Frontend port range end"), pool.frontendPortRangeEnd);
      self.output.nameValue($("Backend port"), pool.backendPort);
      self.output.nameValue($("Frontend IP configuration id"), pool.frontendIPConfiguration.id); }); },



  _listFrontendIP: function(fips) {
    var self = this;
    self.output.table(fips, function(row, fip) {
      row.cell($("Name"), fip.name);
      row.cell($("Provisioning state"), fip.provisioningState);
      row.cell($("Private IP allocation"), fip.privateIPAllocationMethod);
      row.cell($("Private IP "), (fip.privateIPAddress || ""));
      var subnetName = "";
      if (fip.subnet) {
        subnetName = resourceUtils.getResourceInformation(fip.subnet.id).resourceName; } ;

      row.cell($("Subnet"), subnetName);
      var publicipName = "";
      if (fip.publicIPAddress) {
        publicipName = resourceUtils.getResourceInformation(fip.publicIPAddress.id).resourceName; } ;

      row.cell($("Public IP"), publicipName); }); },



  _listProbes: function(probes) {
    var self = this;
    self.output.table(probes, function(row, probe) {
      row.cell($("Name"), probe.name);
      row.cell($("Provisioning state"), probe.provisioningState);
      row.cell($("Protocol"), probe.protocol);
      row.cell($("Port"), probe.port);
      row.cell($("Path"), (probe.requestPath || ""));
      row.cell($("Interval"), probe.intervalInSeconds);
      row.cell($("Count"), probe.numberOfProbes); }); },



  _listBackendAddressPools: function(pools) {
    var self = this;
    self.output.table(pools, function(row, pool) {
      row.cell($("Name"), pool.name);
      row.cell($("Provisioning state"), pool.provisioningState); }); },



  _listBalancingRules: function(rules) {
    var self = this;
    self.output.table(rules, function(row, rule) {
      row.cell($("Name"), rule.name);
      row.cell($("Provisioning state"), rule.provisioningState);
      row.cell($("Load distribution"), rule.loadDistribution);
      row.cell($("Protocol"), rule.protocol);
      row.cell($("Frontend port"), rule.frontendPort);
      row.cell($("Backend port"), rule.backendPort);
      row.cell($("Enable floating IP"), rule.enableFloatingIP);
      row.cell($("Idle timeout in minutes"), rule.idleTimeoutInMinutes); }); },



  _listInboundNatRules: function(rules) {
    var self = this;
    self.output.table(rules, function(row, rule) {
      row.cell($("Name"), rule.name);
      row.cell($("Provisioning state"), rule.provisioningState);
      row.cell($("Protocol"), rule.protocol);
      row.cell($("Frontend port"), rule.frontendPort);
      row.cell($("Backend port"), rule.backendPort);
      row.cell($("Enable floating IP"), rule.enableFloatingIP);
      row.cell($("Idle timeout in minutes"), rule.idleTimeoutInMinutes); }); },



  _listInboundNatPools: function(pools) {
    var self = this;
    self.output.table(pools, function(row, pool) {
      row.cell($("Name"), pool.name);
      row.cell($("Provisioning state"), pool.provisioningState);
      row.cell($("Protocol"), pool.protocol);
      row.cell($("Port range start"), pool.frontendPortRangeStart);
      row.cell($("Port range end"), pool.frontendPortRangeEnd);
      row.cell($("Backend port"), pool.backendPort); }); }});





module.exports = LoadBalancer;
