Name

sn_docker_spoke.DockerUtils

Description

Class containing utility methods for Docker spoke actions.

Script

var DockerUtils = Class.create();
DockerUtils.prototype = {
  initialize: function() {},

  /*
  Params : json object 
  Functionality : Traverses through all key-value pairs part of the inputs and strips the value of any whitespace which are added inadverently around the values.
  Return : updated json object.	
  */

  trimStringInputs: function(inputs) {
      for (var key in inputs) {
          if (inputs[key] && typeof inputs[key] == 'string') {
              inputs[key] = inputs[key].trim();
          }
      }
      return inputs;
  },

  validateTag: function(tag) {
      if (tag) {
          return tag;
      } else {
          throw new Error("Tag cannot be empty.");
      }
  },
  validateRepo: function(repo) {
      if (repo) {
          return repo;
      } else {
          throw new Error("Repository cannot be empty.");
      }
  },
  invalidDetails: function() {
      throw new Error("Mandatory inputs for Private Repository are missing in Docker Credentials table.");

  },
  invalidImageName: function() {
      throw new Error("Image name does not match to the Repository name from Docker Credentials table.");

  },
  /*
  Params : json , input Name 
  Functionality : Parses JSON or throws exception
  Return : parsed json object.	
  */
  parseJson: function(json, inputName) {
      try {
          return JSON.parse(json);
      } catch (err) {
          throw new Error("JSON provided for " + inputName + " input is invalid.");
      }

  },

  parseAdditionalFields: function(fields, reqJson) {
      try {
          var FieldsArr = fields.trim().split(/\^/);
          for (var i = 0; i < FieldsArr.length; i++) {
              var nameValuePair = FieldsArr[i].split(/=/);
              //var keyValueJson = this.getValue(nameValuePair[0], nameValuePair[1]);
              //reqJson[keyValueJson.key] = keyValueJson.value;
              if (nameValuePair[1] == 'true')
                  reqJson[nameValuePair[0]] = true;
              else if (nameValuePair[1] == 'false')
                  reqJson[nameValuePair[0]] = false;
              else
                  reqJson[nameValuePair[0]] = nameValuePair[1];
          }
      } catch (e) {}
      return reqJson;
  },

  checkVolumeExists: function(name) {
      var checkVol = sn_fd.FlowAPI.executeAction('sn_docker_spoke.look_up_volumes');
      var checkName;
      for (var i in checkVol.volume.Volumes) {
          checkName = checkVol.volume.Volumes[i].Name;
          if (checkName === name)
              throw new Error("Provided Name already exists.");
      }

      return name;
  },

  checkBooleanValue: function(value) {
      if (value == "true")
          return true;
      else if (value == "false")
          return false;
      else
          return undefined;
  },

  createServicePayload: function(inputs) {
      var json_data = {};
      json_data.Name = inputs.name ? inputs.name : undefined;

      var labels = {};
      for (var i in inputs.Labels)
          if (inputs.Labels[i].key)
              labels[inputs.Labels[i].key] = inputs.Labels[i].value;
      json_data['Labels'] = labels;

      var TaskTemplate = {};
      TaskTemplate['ForceUpdate'] = inputs.TaskTemplate.ForceUpdate ? parseInt(inputs.TaskTemplate
          .ForceUpdate) : undefined;
      TaskTemplate['Runtime'] = inputs.TaskTemplate.Runtime ? inputs.TaskTemplate.Runtime : undefined;

      var PluginSpec = {};
      PluginSpec['Name'] = inputs.TaskTemplate.PluginSpec.Name ? inputs.TaskTemplate.PluginSpec.Name :
          undefined;
      PluginSpec['Remote'] = inputs.TaskTemplate.PluginSpec.Remote ? inputs.TaskTemplate.PluginSpec.Remote :
          undefined;
      PluginSpec['Disabled'] = Boolean(inputs.TaskTemplate.PluginSpec.Disabled);

      var PluginPrivilege = {};
      var PluginSpecFlag = false;
      for (var i in inputs.TaskTemplate.PluginSpec.PluginPrivilege) {
          if (inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Name) {
              PluginPrivilege[inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Name] = inputs.TaskTemplate
                  .PluginSpec.PluginPrivilege[i].Name ? inputs.TaskTemplate.PluginSpec.PluginPrivilege[i]
                  .Name : undefined;
              PluginPrivilege[inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Description] = inputs
                  .TaskTemplate.PluginSpec.PluginPrivilege[i].Description ? inputs.TaskTemplate.PluginSpec
                  .PluginPrivilege[i].Description : undefined;

              var Value = inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Value;
              if (Value.length >= 1 && Value[0] != "") {
                  PluginPrivilege['Value'] = [];
                  for (var j in Value)
                      PluginPrivilege.Value.push(Value[j]);
              }
              PluginSpecFlag = true;
          }
      }
      if (PluginSpecFlag === true)
          PluginSpec['PluginPrivilege'] = PluginPrivilege;

      if (inputs.TaskTemplate.PluginSpec.Name || inputs.TaskTemplate.PluginSpec.Remote || PluginSpecFlag ===
          true)
          TaskTemplate['PluginSpec'] = PluginSpec;

      var ContainerSpec = {};
      ContainerSpec['Image'] = inputs.TaskTemplate.ContainerSpec.Image ? inputs.TaskTemplate.ContainerSpec
          .Image : undefined;
      ContainerSpec['Hostname'] = inputs.TaskTemplate.ContainerSpec.Hostname ? inputs.TaskTemplate
          .ContainerSpec.Hostname : undefined;
      ContainerSpec['Dir'] = inputs.TaskTemplate.ContainerSpec.Dir ? inputs.TaskTemplate.ContainerSpec.Dir :
          undefined;
      ContainerSpec['User'] = inputs.TaskTemplate.ContainerSpec.User ? inputs.TaskTemplate.ContainerSpec
          .User : undefined;
      ContainerSpec['TTY'] = new DockerUtils().checkBooleanValue(inputs.TaskTemplate.ContainerSpec.TTY);
      ContainerSpec['OpenStdin'] = new DockerUtils().checkBooleanValue(inputs.TaskTemplate.ContainerSpec.OpenStdin);
      ContainerSpec['ReadOnly'] = new DockerUtils().checkBooleanValue(inputs.TaskTemplate.ContainerSpec.ReadOnly);
      ContainerSpec['StopSignal'] = inputs.TaskTemplate.ContainerSpec.StopSignal ? inputs.TaskTemplate
          .ContainerSpec.StopSignal : undefined;
      ContainerSpec['StopGracePeriod'] = inputs.TaskTemplate.ContainerSpec.StopGracePeriod ? parseInt(inputs
          .TaskTemplate.ContainerSpec.StopGracePeriod) : undefined;
      ContainerSpec['Isolation'] = inputs.TaskTemplate.ContainerSpec.Isolation ? inputs.TaskTemplate
          .ContainerSpec.Isolation : undefined;
      ContainerSpec['Init'] = new DockerUtils().checkBooleanValue(inputs.TaskTemplate.ContainerSpec.Init);

      var Command = inputs.TaskTemplate.ContainerSpec.Command;
      if (Command.length >= 1 && Command[0] != "") {
          ContainerSpec['Command'] = [];
          for (var i in Command)
              ContainerSpec.Command.push(Command[i]);
      }

      var Args = inputs.TaskTemplate.ContainerSpec.Args;
      if (Args.length >= 1 && Args[0] != "") {
          ContainerSpec['Args'] = [];
          for (var i in Args)
              ContainerSpec.Args.push(Args[i]);
      }

      var Env = inputs.TaskTemplate.ContainerSpec.Env;
      if (Env.length >= 1 && Env[0] != "") {
          ContainerSpec['Env'] = [];
          for (var i in Env)
              ContainerSpec.Env.push(Env[i]);
      }

      var Groups = inputs.TaskTemplate.ContainerSpec.Groups;
      if (Groups.length >= 1 && Groups[0] != "") {
          ContainerSpec['Groups'] = [];
          for (var i in Groups)
              ContainerSpec.Groups.push(Groups[i]);
      }

      var Hosts = inputs.TaskTemplate.ContainerSpec.Hosts;
      if (Hosts.length >= 1 && Hosts[0] != "") {
          ContainerSpec['Hosts'] = [];
          for (var i in Hosts)
              ContainerSpec.Hosts.push(Hosts[i]);
      }

      var CapabilityAdd = inputs.TaskTemplate.ContainerSpec.CapabilityAdd;
      if (CapabilityAdd.length >= 1 && CapabilityAdd[0] != "") {
          ContainerSpec['CapabilityAdd'] = [];
          for (var i in CapabilityAdd)
              ContainerSpec.CapabilityAdd.push(CapabilityAdd[i]);
      }

      var CapabilityDrop = inputs.TaskTemplate.ContainerSpec.CapabilityDrop;
      if (CapabilityDrop.length >= 1 && CapabilityDrop[0] != "") {
          ContainerSpec['CapabilityDrop'] = [];
          for (var i in CapabilityDrop)
              ContainerSpec.CapabilityDrop.push(CapabilityDrop[i]);
      }

      var labels = {};
      for (var i in inputs.TaskTemplate.ContainerSpec.Labels)
          if (inputs.TaskTemplate.ContainerSpec.Labels[i].key)
              labels[inputs.TaskTemplate.ContainerSpec.Labels[i].key] = inputs.TaskTemplate.ContainerSpec
              .Labels[i].value;
      ContainerSpec['Labels'] = labels;

      var Privileges = {};
      var privilege = inputs.TaskTemplate.ContainerSpec.Privileges;
      var CredentialSpec = {};
      var CredentialSpecFlag = false;
      CredentialSpec['Config'] = privilege.CredentialSpec.Config ? privilege.CredentialSpec.Config :
          undefined;
      CredentialSpec['File'] = privilege.CredentialSpec.File ? privilege.CredentialSpec.File : undefined;
      CredentialSpec['Registry'] = privilege.CredentialSpec.Registry ? privilege.CredentialSpec.Registry :
          undefined;
      if (privilege.CredentialSpec.Config || privilege.CredentialSpec.File || privilege.CredentialSpec
          .Registry) {
          Privileges['CredentialSpec'] = CredentialSpec;
          CredentialSpecFlag = true;
      }

      var SELinuxContext = {};
      var SELinuxContextFlag = false;
      SELinuxContext['Disable'] = Boolean(privilege.SELinuxContext.Disable);
      SELinuxContext['User'] = privilege.SELinuxContext.User ? privilege.SELinuxContext.User : undefined;
      SELinuxContext['Role'] = privilege.SELinuxContext.Role ? privilege.SELinuxContext.Role : undefined;
      SELinuxContext['Type'] = privilege.SELinuxContext.Type ? privilege.SELinuxContext.Type : undefined;
      SELinuxContext['Level'] = privilege.SELinuxContext.Level ? privilege.SELinuxContext.Level : undefined;
      if (privilege.SELinuxContext.User && privilege.SELinuxContext.Role && privilege.SELinuxContext.Type &&
          privilege.SELinuxContext.Level) {
          Privileges['SELinuxContext'] = SELinuxContext;
          SELinuxContextFlag = true;
      }

      if (CredentialSpecFlag === true || SELinuxContextFlag === true)
          ContainerSpec['Privileges'] = Privileges;

      ContainerSpec['Mounts'] = [];
      for (var i in inputs.TaskTemplate.ContainerSpec.Mounts) {
          var Mounts = {};
          var mount = inputs.TaskTemplate.ContainerSpec.Mounts[i];
          Mounts['Target'] = mount.Target ? mount.Target : undefined;
          Mounts['Source'] = mount.Source ? mount.Source : undefined;
          Mounts['Type'] = mount.Type ? mount.Type : undefined;
          Mounts['ReadOnly'] = new DockerUtils().checkBooleanValue(mount.ReadOnly);
          Mounts['Consistency'] = mount.Consistency ? mount.Consistency : undefined;

          var BindOptions = {};
          var BindFlag = false;
          if (mount.BindOptions.Propagation && mount.BindOptions.NonRecursive) {
              BindOptions['Propagation'] = mount.BindOptions.Propagation ? mount.BindOptions.Propagation :
                  undefined;
              BindOptions['NonRecursive'] = new DockerUtils().checkBooleanValue(mount.BindOptions.NonRecursive);
              BindFlag = true;
              Mounts['BindOptions'] = BindOptions;
          }

          var VolumeOptions = {};
          var VolumeFlag = false;
          var VolumeOptionsFlag = false;
          VolumeOptions['NoCopy'] = new DockerUtils().checkBooleanValue(mount.VolumeOptions.NoCopy);
          var VolumeOptionsLabels = {};
          for (var j in mount.VolumeOptions.Labels)
              if (mount.VolumeOptions.Labels[j].key) {
                  VolumeOptionsLabels[mount.VolumeOptions.Labels[j].key] = mount.VolumeOptions.Labels[j]
                      .value;
                  VolumeOptionsFlag = true;
              }
          if (VolumeOptionsFlag == true)
              VolumeOptions['Labels'] = VolumeOptionsLabels;

          var VolumeOptionsDriverConfig = {};
          VolumeOptionsDriverConfig['Name'] = mount.VolumeOptions.DriverConfig
              .Name ? mount.VolumeOptions.DriverConfig.Name : undefined;
          var OptionsFlag = false;
          for (var j in mount.VolumeOptions.DriverConfig.Options) {
              if (mount.VolumeOptions.DriverConfig.Options[j].key) {
                  var VolumeOptionsDriverConfigOptions = {};
                  VolumeOptionsDriverConfigOptions[mount.VolumeOptions
                          .DriverConfig.Options[j].key] = mount.VolumeOptions
                      .DriverConfig.Options[j].value;

                  VolumeOptionsDriverConfig['Options'] = VolumeOptionsDriverConfigOptions;
                  OptionsFlag = true;
              }
          }
          if (VolumeOptionsDriverConfig.Name && OptionsFlag == true)
              VolumeOptions['DriverConfig'] = VolumeOptionsDriverConfig;

          if (VolumeOptions.DriverConfig && VolumeOptions.Labels) {
              Mounts['VolumeOptions'] = VolumeOptions;
              VolumeFlag = true;
          }

          var TmpfsOptions = {};
          var TmpfsFlag = false;
          TmpfsOptions['SizeBytes'] = mount.TmpfsOptions.SizeBytes ? parseInt(mount.TmpfsOptions
              .SizeBytes) : undefined;
          TmpfsOptions['Mode'] = mount.TmpfsOptions.Mode ? parseInt(mount.TmpfsOptions.Mode) : undefined;
          if (mount.TmpfsOptions.SizeBytes && mount.TmpfsOptions.Mode) {
              Mounts['TmpfsOptions'] = TmpfsOptions;
              TmpfsFlag = true;
          }

          if (mount.Target || mount.Source || mount.Type || mount.ReadOnly || mount.Consistency ||
              BindFlag === true || VolumeFlag === true || TmpfsFlag === true)
              ContainerSpec.Mounts.push(Mounts);
      }

      var healthcheck = {};

      var Test = inputs.TaskTemplate.ContainerSpec.HealthCheck.Test;
      var testFlag = false;
      if (Test.length >= 1 && Test[0] != "") {
          healthcheck['Test'] = [];
          for (var i in Test) {
              healthcheck.Test.push(Test[i]);
              testFlag = true;
          }
      }

      var health = inputs.TaskTemplate.ContainerSpec.HealthCheck;
      healthcheck['Interval'] = health.Interval ? parseInt(health.Interval) : undefined;
      healthcheck['Timeout'] = health.Timeout ? parseInt(health.Timeout) : undefined;
      healthcheck['Retries'] = health.Retries ? parseInt(health.Retries) : undefined;
      healthcheck['StartPeriod'] = health.StartPeriod ? parseInt(health.StartPeriod) : undefined;
      if (health.Interval || health.Timeout || health.Retries || health.StartPeriod || testFlag === true)
          ContainerSpec['HealthCheck'] = healthcheck;

      var DNSConfig = {};
      var Nameservers = inputs.TaskTemplate.ContainerSpec.DNSConfig.Nameservers;
      var NameserversFlag = false;
      if (Nameservers.length >= 1 && Nameservers[0] != "") {
          DNSConfig['Nameservers'] = [];
          for (var i in Nameservers) {
              DNSConfig.Nameservers.push(Nameservers[i]);
              NameserversFlag = true;
          }
      }

      var Search = inputs.TaskTemplate.ContainerSpec.DNSConfig.Search;
      var SearchFlag = false;
      if (Search.length >= 1 && Search[0] != "") {
          DNSConfig['Search'] = [];
          for (var i in Search) {
              DNSConfig.Search.push(Search[i]);
              SearchFlag = true;
          }
      }

      var Options = inputs.TaskTemplate.ContainerSpec.DNSConfig.Options;
      var OptionsFlag = false;
      if (Options.length >= 1 && Options[0] != "") {
          DNSConfig['Options'] = [];
          for (var i in Options) {
              DNSConfig.Options.push(Options[i]);
              OptionsFlag = true;
          }
      }

      if (NameserversFlag === true || SearchFlag === true || OptionsFlag === true)
          ContainerSpec['DNSConfig'] = DNSConfig;

      ContainerSpec['Secrets'] = [];
      for (var i in inputs.TaskTemplate.ContainerSpec.Secrets) {
          var Secrets = {};
          var secret = inputs.TaskTemplate.ContainerSpec.Secrets[i];
          Secrets['SecretID'] = secret.SecretID ? secret.SecretID : undefined;
          Secrets['SecretName'] = secret.SecretName ? secret.SecretName : undefined;

          var File = {};
          File['Name'] = secret.File.Name ? secret.File.Name : undefined;
          File['UID'] = secret.File.UID ? secret.File.UID : undefined;
          File['GID'] = secret.File.GID ? secret.File.GID : undefined;
          File['Mode'] = secret.File.Mode ? parseInt(secret.File.Mode) : undefined;
          if (secret.File.Name || secret.File.UID || secret.File.GID || secret.File.Mode)
              Secrets['File'] = File;

          if (secret.SecretID || secret.SecretName)
              ContainerSpec.Secrets.push(Secrets);
      }

      ContainerSpec['Configs'] = [];
      for (var i in inputs.TaskTemplate.ContainerSpec.Configs) {
          var Configs = {};
          var config = inputs.TaskTemplate.ContainerSpec.Configs[i];
          Configs['ConfigID'] = config.ConfigID ? config.ConfigID : undefined;
          Configs['ConfigName'] = config.ConfigName ? config.ConfigName : undefined;
          Configs['Runtime'] = config.Runtime ? JSON.parse(config.Runtime) : undefined;

          var File = {};
          File['Name'] = config.File.Name ? config.File.Name : undefined;
          File['UID'] = config.File.UID ? config.File.UID : undefined;
          File['GID'] = config.File.GID ? config.File.GID : undefined;
          File['Mode'] = config.File.Mode ? parseInt(config.File.Mode) : undefined;
          if (config.File.Name || config.File.UID || config.File.GID || config.File.Mode)
              Configs['File'] = File;

          if (config.ConfigID || config.ConfigName)
              ContainerSpec.Configs.push(Configs);
      }

      var Sysctls = {};
      for (var i in inputs.TaskTemplate.ContainerSpec.Sysctls)
          if (inputs.TaskTemplate.ContainerSpec.Sysctls[i].key)
              labels[inputs.TaskTemplate.ContainerSpec.Sysctls[i].key] = inputs.TaskTemplate.ContainerSpec
              .Sysctls[i].value;
      ContainerSpec['Sysctls'] = Sysctls;

      ContainerSpec['Ulimits'] = [];
      for (var i in inputs.TaskTemplate.ContainerSpec.Ulimits) {
          var Ulimits = {};
          var ulimit = inputs.TaskTemplate.ContainerSpec.Ulimits[i];
          Ulimits['Name'] = ulimit.Name ? ulimit.Name : undefined;
          Ulimits['Soft'] = ulimit.Soft ? parseInt(ulimit.Soft) : undefined;
          Ulimits['Hard'] = ulimit.Hard ? parseInt(ulimit.Hard) : undefined;
          if (ulimit.Name && ulimit.Soft && ulimit.Hard)
              ContainerSpec.Ulimits.push(Ulimits);
      }

      if (inputs.TaskTemplate.ContainerSpec.Image)
          TaskTemplate['ContainerSpec'] = ContainerSpec;

      var NetworkAttachmentSpec = {};
      NetworkAttachmentSpec['Mode'] = inputs.TaskTemplate.NetworkAttachmentSpec.Mode ? parseInt(inputs
          .TaskTemplate.NetworkAttachmentSpec.Mode) : undefined;
      if (inputs.TaskTemplate.NetworkAttachmentSpec.Mode)
          TaskTemplate['NetworkAttachmentSpec'] = NetworkAttachmentSpec;

      var Resources = {};
      var Limits = {};
      var limit = inputs.TaskTemplate.Resources.Limits;
      Limits['NanoCPUs'] = limit.NanoCPUs ? parseInt(limit.NanoCPUs) : undefined;
      Limits['MemoryBytes'] = limit.MemoryBytes ? parseInt(limit.MemoryBytes) : undefined;
      Limits['Pids'] = limit.Pids ? parseInt(limit.Pids) : undefined;
      if (limit.NanoCPUs || limit.MemoryBytes || limit.Pids)
          Resources['Limits'] = Limits;

      var Reservation = {};
      var reserv = inputs.TaskTemplate.Resources.Reservation;
      Reservation['NanoCPUs'] = reserv.NanoCPUs ? parseInt(reserv.NanoCPUs) : undefined;
      Reservation['MemoryBytes'] = reserv.MemoryBytes ? parseInt(reserv.MemoryBytes) : undefined;

      Reservation['GenericResources'] = [];
      var GenericFlag = false;
      for (var i in inputs.TaskTemplate.Resources.Reservation.GenericResources) {
          var GenericResources = {};
          var genericR = inputs.TaskTemplate.Resources.Reservation.GenericResources[i];

          var NamedResourceSpec = {};
          var NamedResourceFlag = false;
          NamedResourceSpec['Kind'] = genericR.NamedResourceSpec.Kind ? genericR.NamedResourceSpec.Kind :
              undefined;
          NamedResourceSpec['Value'] = genericR.NamedResourceSpec.Value ? genericR.NamedResourceSpec.Value :
              undefined;
          if (genericR.NamedResourceSpec.Kind && genericR.NamedResourceSpec.Value) {
              GenericResources['NamedResourceSpec'] = NamedResourceSpec;
              NamedResourceFlag = true;
          }

          var DiscreteResourceSpec = {};
          var DiscreteResourceFlag = false;
          DiscreteResourceSpec['Kind'] = genericR.DiscreteResourceSpec.Kind ? genericR.DiscreteResourceSpec
              .Kind : undefined;
          DiscreteResourceSpec['Value'] = genericR.DiscreteResourceSpec.Value ? parseInt(genericR
              .DiscreteResourceSpec.Value) : undefined;
          if (genericR.DiscreteResourceSpec.Kind && genericR.DiscreteResourceSpec.Value) {
              GenericResources['DiscreteResourceSpec'] = DiscreteResourceSpec;
              DiscreteResourceFlag = true;
          }

          if (NamedResourceFlag === true && DiscreteResourceFlag === true)
              Reservation.GenericResources.push(GenericResources);

          GenericFlag = true;
      }

      if (limit.NanoCPUs || limit.MemoryBytes || GenericFlag === true)
          Resources['Reservation'] = Reservation;

      if (Resources.Limits || Resources.Reservation)
          TaskTemplate['Resources'] = Resources;

      var RestartPolicy = {};
      var restartP = inputs.TaskTemplate.RestartPolicy;
      RestartPolicy['Condition'] = restartP.Condition ? restartP.Condition : undefined;
      RestartPolicy['Delay'] = restartP.Delay ? parseInt(restartP.Delay) : undefined;
      RestartPolicy['MaxAttempts'] = restartP.MaxAttempts ? parseInt(restartP.MaxAttempts) : undefined;
      RestartPolicy['Window'] = restartP.Window ? parseInt(restartP.Window) : undefined;
      if (restartP.Condition || restartP.Delay || restartP.MaxAttempts || restartP.Window)
          TaskTemplate['RestartPolicy'] = RestartPolicy;

      var Placement = {};
      var placeM = inputs.TaskTemplate.Placement;
      Placement['MaxReplicas'] = placeM.MaxReplicas ? parseInt(placeM.MaxReplicas) : undefined;

      var Constraints = placeM.Constraints;
      var constraintsFlag = false;
      if (Constraints.length >= 1 && Constraints[0] != "") {
          Placement['Constraints'] = [];
          for (var i in Constraints) {
              Placement.Constraints.push(Constraints[i]);
              constraintsFlag = true;
          }
      }

      Placement['Preferences'] = [];
      var PreferencesFlag = false;
      for (var i in placeM.Preferences) {
          var Preferences = {};
          var prefer = placeM.Preferences[i];
          var Spread = {};
          Spread['SpreadDescriptor'] = prefer.Spread.SpreadDescriptor ? prefer.Spread.SpreadDescriptor :
              undefined;
          if (prefer.Spread.SpreadDescriptor)
              Preferences['Spread'] = Spread;

          if (prefer.Spread) {
              Placement.Preferences.push(Preferences);
              PreferencesFlag = true;
          }
      }

      Placement['Platforms'] = [];
      var PlatformsFlag = false;
      for (var i in placeM.Platforms) {
          var Platforms = {};
          var platF = placeM.Platforms[i];
          Platforms['Architecture'] = platF.Architecture ? platF.Architecture : undefined;
          Platforms['OS'] = platF.OS ? platF.OS : undefined;

          if (platF.Architecture || platF.OS) {
              Placement.Platforms.push(Platforms);
              PlatformsFlag = true;
          }
      }

      if (placeM.MaxReplicas || constraintsFlag === true || PreferencesFlag === true || PlatformsFlag ===
          true)
          TaskTemplate['Placement'] = Placement;

      TaskTemplate['Networks'] = [];
      var NetworksFlag = false;
      for (var i in inputs.TaskTemplate.Networks) {
          var Networks = {};
          var network = inputs.TaskTemplate.Networks[i];
          Networks['Target'] = network.Target ? network.Target : undefined;

          var Aliases = network.Aliases;
          var AliasesFlag = false;
          if (Aliases.length >= 1 && Aliases[0] != "") {
              Networks['Aliases'] = [];
              for (var i in Aliases) {
                  Networks.Aliases.push(Aliases[i]);
                  AliasesFlag = true;
              }
          }

          var DriverOpts = {};
          var DriverOptsFlag = false;
          for (var j in network.DriverOpts)
              if (network.DriverOpts[j].key) {
                  DriverOpts[network.DriverOpts[j].key] = network.DriverOpts[j].value;
                  DriverOptsFlag = true;
              }
          if (DriverOptsFlag === true)
              Networks['DriverOpts'] = DriverOpts;

          if (network.Target || AliasesFlag === true || DriverOptsFlag === true) {
              TaskTemplate.Networks.push(Networks);
              NetworksFlag = true;
          }
      }

      var LogDriver = {};
      LogDriver['Name'] = inputs.TaskTemplate.LogDriver.Name ? inputs.TaskTemplate.LogDriver.Name :
          undefined;

      var Options = {};
      var OptionsFlag = false;
      for (var i in inputs.TaskTemplate.LogDriver.Options)
          if (inputs.TaskTemplate.LogDriver.Options[i].key) {
              Options[inputs.TaskTemplate.LogDriver.Options[i].key] = inputs.TaskTemplate.LogDriver.Options[
                  i].value;
              OptionsFlag = true;
          }
      if (OptionsFlag === true)
          LogDriver['Options'] = Options;

      if (inputs.TaskTemplate.LogDriver.Name || OptionsFlag === true)
          TaskTemplate['LogDriver'] = LogDriver;

      if (inputs.TaskTemplate.ContainerSpec.Image)
          json_data['TaskTemplate'] = TaskTemplate;

      var Mode = {};
      var Replicated = {};
      if ((inputs.mode) && (inputs.mode.Replicated) && (inputs.mode.Replicated.Replicas))
          Replicated['Replicas'] = inputs.mode.Replicated.Replicas;
      else
          Replicated['Replicas'] = 0;
      Mode['Replicated'] = Replicated;
      json_data['Mode'] = Mode;

      var UpdateConfig = {};
      UpdateConfig['Parallelism'] = inputs.UpdateConfig.Parallelism ? parseInt(inputs.UpdateConfig
          .Parallelism) : undefined;
      UpdateConfig['Delay'] = inputs.UpdateConfig.Delay ? parseInt(inputs.UpdateConfig.Delay) : undefined;
      UpdateConfig['FailureAction'] = inputs.UpdateConfig.FailureAction ? inputs.UpdateConfig
          .FailureAction : undefined;
      UpdateConfig['Monitor'] = inputs.UpdateConfig.Monitor ? parseInt(inputs.UpdateConfig.Monitor) :
          undefined;
      UpdateConfig['MaxFailureRatio'] = inputs.UpdateConfig.MaxFailureRatio ? parseInt(inputs.UpdateConfig
          .MaxFailureRatio) : undefined;
      if (inputs.UpdateConfig.Parallelism || inputs.UpdateConfig.Delay || inputs.UpdateConfig
          .FailureAction || inputs.UpdateConfig.Monitor || inputs.UpdateConfig.MaxFailureRatio)
          json_data['UpdateConfig'] = UpdateConfig;

      var RollbackConfig = {};
      RollbackConfig['Parallelism'] = inputs.RollbackConfig.Parallelism ? parseInt(inputs.RollbackConfig
          .Parallelism) : undefined;
      RollbackConfig['Delay'] = inputs.RollbackConfig.Delay ? parseInt(inputs.RollbackConfig.Delay) :
          undefined;
      RollbackConfig['FailureAction'] = inputs.RollbackConfig.FailureAction ? inputs.RollbackConfig
          .FailureAction : undefined;
      RollbackConfig['Monitor'] = inputs.RollbackConfig.Monitor ? parseInt(inputs.RollbackConfig.Monitor) :
          undefined;
      RollbackConfig['MaxFailureRatio'] = inputs.RollbackConfig.MaxFailureRatio ? parseInt(inputs
          .RollbackConfig.MaxFailureRatio) : undefined;
      if (inputs.RollbackConfig.Parallelism || inputs.RollbackConfig.Delay || inputs.RollbackConfig
          .FailureAction || inputs.RollbackConfig.Monitor || inputs.RollbackConfig.MaxFailureRatio)
          json_data['RollbackConfig'] = RollbackConfig;

      json_data['Networks'] = [];
      for (var i in inputs.networks) {
          var Networks = {};
          var network = inputs.networks[i];
          Networks['Target'] = network.Target ? network.Target : undefined;

          if (network.Target)
              json_data.Networks.push(Networks);
      }

      var EndpointSpec = {};
      EndpointSpec['Mode'] = inputs.EndpointSpec.Mode ? inputs.EndpointSpec.Mode : undefined;

      EndpointSpec['Ports'] = [];
      var PortFlag = false;
      for (var i in inputs.EndpointSpec.Ports) {
          var Ports = {};
          var port = inputs.EndpointSpec.Ports[i];
          Ports['Name'] = port.Name ? port.Name : undefined;
          Ports['Protocol'] = port.Protocol ? port.Protocol : undefined;
          Ports['TargetPort'] = port.TargetPort ? parseInt(port.TargetPort) : undefined;
          Ports['PublishedPort'] = port.PublishedPort ? parseInt(port.PublishedPort) : undefined;
          Ports['PublishMode'] = port.PublishMode ? port.PublishMode : undefined;

          if (port.Target || port.Protocol || port.TargetPort || port.PublishedPort || port.PublishMode) {
              EndpointSpec.Ports.push(Ports);
              PortFlag = true;
          }
      }

      if (inputs.EndpointSpec.Mode || PortFlag === true)
          json_data['EndpointSpec'] = EndpointSpec;

      return json_data;
  },

  createContainerPayload: function(inputs) {
      var json_data = {};
      try {
          json_data['Image'] = inputs.Image ? inputs.Image : undefined;

          var exposedports = {};
          for (var i in inputs.ExposedPorts)
              if (inputs.ExposedPorts[i].key)
                  exposedports[inputs.ExposedPorts[i].key] = JSON.parse(inputs.ExposedPorts[i].value);
          json_data['ExposedPorts'] = exposedports;

          var env = inputs.Env;
          if (env.length >= 1 && env[0] != "") {
              json_data['Env'] = [];
              for (var i in env)
                  json_data.Env.push(env[i]);
          }

          var cmd = inputs.Cmd;
          if (cmd.length >= 1 && cmd[0] != "") {
              json_data['Cmd'] = [];
              for (var i in cmd)
                  json_data.Cmd.push(cmd[i]);
          }

          var entrypoint = inputs.Entrypoint;
          if (entrypoint.length >= 1 && entrypoint[0] != "") {
              json_data['Entrypoint'] = [];
              for (var i in entrypoint)
                  json_data.Entrypoint.push(entrypoint[i]);
          }

          var onbuild = inputs.OnBuild;
          if (onbuild.length >= 1 && onbuild[0] != "") {
              json_data['OnBuild'] = [];
              for (var i in onbuild)
                  json_data.OnBuild.push(onbuild[i]);
          }

          var shell = inputs.Shell;
          if (shell.length >= 1 && shell[0] != "") {
              json_data['Shell'] = [];
              for (var i in shell)
                  json_data.Shell.push(shell[i]);
          }

          var healthcheck = {};
          var test = inputs.Healthcheck.Test;
          if (test.length >= 1 && test[0] != "") {
              healthcheck['Test'] = [];
              for (var i in test)
                  healthcheck.Test.push(test[i]);
          }

          healthcheck['Interval'] = inputs.Healthcheck.Interval ? parseInt(inputs.Healthcheck.Interval) :
              undefined;
          healthcheck['Timeout'] = inputs.Healthcheck.Timeout ? parseInt(inputs.Healthcheck.Timeout) :
              undefined;
          healthcheck['Retries'] = inputs.Healthcheck.Retries ? parseInt(inputs.Healthcheck.Retries) :
              undefined;
          healthcheck['StartPeriod'] = inputs.Healthcheck.StartPeriod ? parseInt(inputs.Healthcheck
              .StartPeriod) : undefined;
          json_data['Healthcheck'] = healthcheck;

          var volumes = {};
          for (var i in inputs.Volumes)
              if (inputs.Volumes[i].key)
                  volumes[inputs.Volumes[i].key] = JSON.parse(inputs.Volumes[i].value);
          json_data['Volumes'] = volumes;

          var labels = {};
          for (var i in inputs.Labels)
              if (inputs.Labels[i].key)
                  labels[inputs.Labels[i].key] = inputs.Labels[i].value;
          json_data['Labels'] = labels;

          var hostconfig = {};
          for (var key in inputs.HostConfig) {
              if (inputs.HostConfig[key]) {
                  if (key === "CgroupParent" || key === "Healthcheck" || key === "CpusetCpus" || key ===
                      "CpusetMems" || key === "ContainerIDFile" || key === "NetworkMode" || key ===
                      "VolumeDriver" || key === "CgroupnsMode" || key === "IpcMode" || key === "Cgroup" ||
                      key === "PidMode" || key === "UTSMode" || key === "UsernsMode" || key === "Runtime" ||
                      key === "Isolation")
                      hostconfig[key] = inputs.HostConfig[key] ? inputs.HostConfig[key] : undefined;

                  if (key === "CpuShares" || key === "Memory" || key === "BlkioWeight" || key ===
                      "CpuPeriod" || key === "CpuQuota" || key === "CpuRealtimePeriod" || key ===
                      "CpuRealtimeRuntime" || key === "KernelMemory" || key === "KernelMemoryTCP" || key ===
                      "MemoryReservation" || key === "MemorySwap" || key === "MemorySwappiness" || key ===
                      "NanoCpus" || key === "PidsLimit" || key === "CpuCount" || key === "CpuPercent" ||
                      key === "IOMaximumIOps" || key === "IOMaximumBandwidth" || key === "OomScoreAdj" ||
                      key === "ShmSize")
                      hostconfig[key] = inputs.HostConfig[key] ? parseInt(inputs.HostConfig[key]) :
                      undefined;
              }
          }

          hostconfig['ReadonlyRootfs'] = new DockerUtils().checkBooleanValue(inputs.HostConfig
              .ReadonlyRootfs);
          hostconfig['OomKillDisable'] = new DockerUtils().checkBooleanValue(inputs.HostConfig
              .OomKillDisable);
          hostconfig['Init'] = new DockerUtils().checkBooleanValue(inputs.HostConfig.Init);
          hostconfig['AutoRemove'] = new DockerUtils().checkBooleanValue(inputs.HostConfig.AutoRemove);
          hostconfig['Privileged'] = new DockerUtils().checkBooleanValue(inputs.HostConfig.Privileged);
          hostconfig['PublishAllPorts'] = new DockerUtils().checkBooleanValue(inputs.HostConfig
              .PublishAllPorts);

          hostconfig['BlkioWeightDevice'] = [];
          for (var i in inputs.HostConfig.BlkioWeightDevice) {
              var BlkioWeightDevice = {};
              BlkioWeightDevice['Path'] = inputs.HostConfig.BlkioWeightDevice[i].Path ? inputs.HostConfig
                  .BlkioWeightDevice[i].Path : undefined;
              BlkioWeightDevice['Weight'] = inputs.HostConfig.BlkioWeightDevice[i].Weight ? parseInt(inputs
                  .HostConfig.BlkioWeightDevice[i].Weight) : undefined;
              if (BlkioWeightDevice['Path'] && BlkioWeightDevice['Weight'])
                  hostconfig.BlkioWeightDevice.push(BlkioWeightDevice);
          }

          hostconfig['BlkioDeviceReadBps'] = [];
          for (var i in inputs.HostConfig.BlkioDeviceReadBps) {
              var BlkioDeviceReadBps = {};
              BlkioDeviceReadBps['Path'] = inputs.HostConfig.BlkioDeviceReadBps[i].Path ? inputs.HostConfig
                  .BlkioDeviceReadBps[i].Path : undefined;
              BlkioDeviceReadBps['Rate'] = inputs.HostConfig.BlkioDeviceReadBps[i].Weight ? parseInt(inputs
                  .HostConfig.BlkioDeviceReadBps[i].Weight) : undefined;
              if (BlkioDeviceReadBps['Path'] && BlkioDeviceReadBps['Rate'])
                  hostconfig.BlkioDeviceReadBps.push(BlkioDeviceReadBps);
          }

          hostconfig['BlkioDeviceWriteBps'] = [];
          for (var i in inputs.HostConfig.BlkioDeviceWriteBps) {
              var BlkioDeviceWriteBps = {};
              BlkioDeviceWriteBps['Path'] = inputs.HostConfig.BlkioDeviceWriteBps[i].Path ? inputs
                  .HostConfig.BlkioDeviceWriteBps[i].Path : undefined;
              BlkioDeviceWriteBps['Rate'] = inputs.HostConfig.BlkioDeviceWriteBps[i].Rate ? parseInt(inputs
                  .HostConfig.BlkioDeviceWriteBps[i].Rate) : undefined;
              if (BlkioDeviceWriteBps['Path'] && BlkioDeviceWriteBps['Rate'])
                  hostconfig.BlkioDeviceWriteBps.push(BlkioDeviceWriteBps);
          }

          hostconfig['BlkioDeviceReadIOps'] = [];
          for (var i in inputs.HostConfig.BlkioDeviceReadIOps) {
              var BlkioDeviceReadIOps = {};
              BlkioDeviceReadIOps['Path'] = inputs.HostConfig.BlkioDeviceReadIOps[i].Path ? inputs
                  .HostConfig.BlkioDeviceReadIOps[i].Path : undefined;
              BlkioDeviceReadIOps['Rate'] = inputs.HostConfig.BlkioDeviceReadIOps[i].Rate ? parseInt(inputs
                  .HostConfig.BlkioDeviceReadIOps[i].Rate) : undefined;
              if (BlkioDeviceReadIOps['Path'] && BlkioDeviceReadIOps['Rate'])
                  hostconfig.BlkioDeviceReadIOps.push(BlkioDeviceReadIOps);
          }

          hostconfig['BlkioDeviceWriteIOps'] = [];
          for (var i in inputs.HostConfig.BlkioDeviceWriteIOps) {
              var BlkioDeviceWriteIOps = {};
              BlkioDeviceWriteIOps['Path'] = inputs.HostConfig.BlkioDeviceWriteIOps[i].Path ? inputs
                  .HostConfig.BlkioDeviceWriteIOps[i].Path : undefined;
              BlkioDeviceWriteIOps['Rate'] = inputs.HostConfig.BlkioDeviceWriteIOps[i].Rate ? parseInt(
                  inputs.HostConfig.BlkioDeviceWriteIOps[i].Rate) : undefined;
              if (BlkioDeviceWriteIOps['Path'] && BlkioDeviceWriteIOps['Rate'])
                  hostconfig.BlkioDeviceWriteIOps.push(BlkioDeviceWriteIOps);
          }

          hostconfig['Devices'] = [];
          for (var i in inputs.HostConfig.Devices)
              if (inputs.HostConfig.Devices[i].PathOnHost || inputs.HostConfig.Devices[i].PathInContainer ||
                  inputs.HostConfig.Devices[i].CgroupPermissions)
                  hostconfig.Devices.push(inputs.HostConfig.Devices[i]);

          var DeviceCgroupRules = inputs.HostConfig.DeviceCgroupRules;
          if (DeviceCgroupRules.length <= 1 && DeviceCgroupRules[0] != "") {
              hostconfig['DeviceCgroupRules'] = [];
              for (var i in DeviceCgroupRules)
                  hostconfig.DeviceCgroupRules.push(DeviceCgroupRules[i]);
          }

          hostconfig['DeviceRequests'] = [];
          for (var i in inputs.HostConfig.DeviceRequests) {
              var DeviceRequests = {};
              DeviceRequests['Driver'] = inputs.HostConfig.DeviceRequests[i].Driver ? inputs.HostConfig
                  .DeviceRequests[i].Driver : undefined;
              DeviceRequests['Count'] = inputs.HostConfig.DeviceRequests[i].Count ? parseInt(inputs
                  .HostConfig.DeviceRequests[i].Count) : undefined;

              var DeviceIDs = inputs.HostConfig.DeviceRequests[i].DeviceIDs;
              var DeviceIDsFlag = false;
              if (DeviceIDs.length >= 1 && DeviceIDs[0] != "") {
                  DeviceRequests['DeviceIDs'] = [];
                  for (var j in DeviceIDs) {
                      DeviceRequests.DeviceIDs.push(DeviceIDs[j]);
                      DeviceIDsFlag = true;
                  }
              }

              var Capabilities = inputs.HostConfig.DeviceRequests[i].Capabilities;
              var CapabilitiesFlag = false;
              if (Capabilities.length >= 1 && Capabilities[0] != "") {
                  DeviceRequests['Capabilities'] = [];
                  for (var j in Capabilities) {
                      DeviceRequests.Capabilities.push(Capabilities[j]);
                      CapabilitiesFlag = true;
                  }
              }

              var OptiosFlag = false;
              for (var j in inputs.HostConfig.DeviceRequests[i].Options)
                  if (inputs.HostConfig.DeviceRequests[i].Options[j].key) {
                      DeviceRequests['Options'] = {};
                      DeviceRequests.Options[inputs.HostConfig.DeviceRequests[i].Options[j].key] = inputs
                          .HostConfig.DeviceRequests[i].Options[j].value;
                      OptiosFlag = true;
                  }

              if (DeviceRequests['Driver'] || DeviceRequests['Count'] || DeviceIDsFlag == true ||
                  CapabilitiesFlag == true || OptiosFlag == true)
                  hostconfig.DeviceRequests.push(DeviceRequests);
          }

          hostconfig['Ulimits'] = [];
          for (var i in inputs.HostConfig.Ulimits) {
              var Ulimits = {};
              Ulimits['Name'] = inputs.HostConfig.Ulimits[i].Name ? inputs.HostConfig.Ulimits[i].Name :
                  undefined;
              Ulimits['Soft'] = inputs.HostConfig.Ulimits[i].Soft ? parseInt(inputs.HostConfig.Ulimits[i]
                  .Soft) : undefined;
              Ulimits['Hard'] = inputs.HostConfig.Ulimits[i].Hard ? parseInt(inputs.HostConfig.Ulimits[i]
                  .Hard) : undefined;
              if (Ulimits['Name'] || Ulimits['Soft'] || Ulimits['Hard'])
                  hostconfig.Ulimits.push(Ulimits);
          }

          var LogConfig = {};
          LogConfig['Type'] = inputs.HostConfig.LogConfig.Type ? inputs.HostConfig.LogConfig.Type :
              undefined;
          LogConfig['Config'] = {};
          for (var i in inputs.HostConfig.LogConfig.Config)
              if (inputs.HostConfig.LogConfig.Config[i].key)
                  LogConfig['Config'][inputs.HostConfig.LogConfig.Config[i].key] = inputs.HostConfig
                  .LogConfig.Config[i].value;
          hostconfig['LogConfig'] = LogConfig;

          var PortBindings = {};
          for (var i in inputs.HostConfig.PortBindings) {
              if (inputs.HostConfig.PortBindings[i].key) {
                  PortBindings[inputs.HostConfig.PortBindings[i].key] = [];
                  var port_value = inputs.HostConfig.PortBindings[i].value;
                  for (var j in port_value)
                      PortBindings[inputs.HostConfig.PortBindings[i].key].push(port_value[j]);
              }
          }
          hostconfig['PortBindings'] = PortBindings;

          if (inputs.HostConfig.RestartPolicy.Name) {
              var RestartPolicy = {};
              RestartPolicy['Name'] = inputs.HostConfig.RestartPolicy.Name ? inputs.HostConfig.RestartPolicy
                  .Name : undefined;
              if (inputs.HostConfig.RestartPolicy.Name == "on-failure")
                  RestartPolicy['MaximumRetryCount'] = inputs.HostConfig.RestartPolicy.MaximumRetryCount ?
                  parseInt(inputs.HostConfig.RestartPolicy.MaximumRetryCount) : undefined;
              hostconfig['RestartPolicy'] = RestartPolicy;
          }

          var Binds = inputs.HostConfig.Binds;
          if (Binds.length >= 1 && Binds[0] != "") {
              hostconfig['Binds'] = [];
              for (var i in Binds)
                  hostconfig.Binds.push(Binds[i]);
          }

          var VolumesFrom = inputs.HostConfig.VolumesFrom;
          if (VolumesFrom.length >= 1 && VolumesFrom[0] != "") {
              hostconfig['VolumesFrom'] = [];
              for (var i in VolumesFrom)
                  hostconfig.VolumesFrom.push(VolumesFrom[i]);
          }

          hostconfig['Mounts'] = [];
          for (var i in inputs.HostConfig.Mounts) {
              var Mounts = {};
              var mount = inputs.HostConfig.Mounts[i];
              Mounts['Target'] = mount.Target ? mount.Target : undefined;
              Mounts['Source'] = mount.Source ? mount.Source : undefined;
              Mounts['Type'] = mount.Type ? mount.Type : undefined;
              Mounts['ReadOnly'] = new DockerUtils().checkBooleanValue(mount.ReadOnly);
              Mounts['Consistency'] = mount.Consistency ? inputs.HostConfig.Mounts[i].Consistency :
                  undefined;

              var BindOptions = {};
              var BindFlag = false;
              if (mount.BindOptions.Propagation && mount.BindOptions.NonRecursive) {
                  BindOptions['Propagation'] = mount.BindOptions.Propagation ? inputs
                      .HostConfig.Mounts[i].BindOptions.Propagation : undefined;
                  BindOptions['NonRecursive'] = new DockerUtils().checkBooleanValue(mount.BindOptions
                      .NonRecursive);
                  BindFlag = true;
                  Mounts['BindOptions'] = BindOptions;
              }

              var VolumeOptions = {};
              var VolumeFlag = false;
              var VolumeOptionsFlag = false;
              VolumeOptions['NoCopy'] = new DockerUtils().checkBooleanValue(mount.VolumeOptions.NoCopy);
              var VolumeOptionsLabels = {};
              for (var j in mount.VolumeOptions.Labels)
                  if (mount.VolumeOptions.Labels[j].key) {
                      VolumeOptionsLabels[mount.VolumeOptions.Labels[j].key] = inputs
                          .HostConfig.Mounts[i].VolumeOptions.Labels[j].value;
                      VolumeOptionsFlag = true;
                  }
              if (VolumeOptionsFlag == true)
                  VolumeOptions['Labels'] = VolumeOptionsLabels;

              var VolumeOptionsDriverConfig = {};
              VolumeOptionsDriverConfig['Name'] = mount.VolumeOptions.DriverConfig
                  .Name ? mount.VolumeOptions.DriverConfig.Name : undefined;
              var OptionsFlag = false;
              for (var j in mount.VolumeOptions.DriverConfig.Options) {
                  if (mount.VolumeOptions.DriverConfig.Options[j].key) {
                      var VolumeOptionsDriverConfigOptions = {};
                      VolumeOptionsDriverConfigOptions[mount.VolumeOptions
                              .DriverConfig.Options[j].key] = mount.VolumeOptions
                          .DriverConfig.Options[j].value;

                      VolumeOptionsDriverConfig['Options'] = VolumeOptionsDriverConfigOptions;
                      OptionsFlag = true;
                  }
              }
              if (VolumeOptionsDriverConfig.Name && OptionsFlag == true)
                  VolumeOptions['DriverConfig'] = VolumeOptionsDriverConfig;

              if (VolumeOptions.DriverConfig && VolumeOptions.Labels) {
                  Mounts['VolumeOptions'] = VolumeOptions;
                  VolumeFlag = true;
              }

              var TmpfsOptions = {};
              var TmpfsFlag = false;
              TmpfsOptions['SizeBytes'] = mount.TmpfsOptions.SizeBytes ? parseInt(
                  mount.TmpfsOptions.SizeBytes) : undefined;
              TmpfsOptions['Mode'] = mount.TmpfsOptions.Mode ? parseInt(inputs
                  .HostConfig.Mounts[i].TmpfsOptions.Mode) : undefined;
              if (mount.TmpfsOptions.SizeBytes && mount.TmpfsOptions.Mode) {
                  Mounts['TmpfsOptions'] = TmpfsOptions;
                  TmpfsFlag = true;
              }

              if (mount.Target || mount.Source || mount.Type || mount.ReadOnly || mount.Consistency ||
                  BindFlag === true || VolumeFlag === true || TmpfsFlag === true)
                  hostconfig.Mounts.push(Mounts);
          }

          var CapAdd = inputs.HostConfig.CapAdd;
          if (CapAdd.length >= 1 && CapAdd[0] != "") {
              hostconfig['CapAdd'] = [];
              for (var i in CapAdd)
                  hostconfig.CapAdd.push(CapAdd[i]);
          }

          var CapDrop = inputs.HostConfig.CapDrop;
          if (CapDrop.length >= 1 && CapDrop[0] != "") {
              hostconfig['CapDrop'] = [];
              for (var i in CapDrop)
                  hostconfig.CapDrop.push(CapDrop[i]);
          }

          var Dns = inputs.HostConfig.Dns;
          if (Dns.length >= 1 && Dns[0] != "") {
              hostconfig['Dns'] = [];
              for (var i in Dns)
                  hostconfig.Dns.push(Dns[i]);
          }

          var DnsOptions = inputs.HostConfig.DnsOptions;
          if (DnsOptions.length >= 1 && DnsOptions[0] != "") {
              hostconfig['DnsOptions'] = [];
              for (var i in DnsOptions)
                  hostconfig.DnsOptions.push(DnsOptions[i]);
          }

          var DnsSearch = inputs.HostConfig.DnsSearch;
          if (DnsSearch.length >= 1 && DnsSearch[0] != "") {
              hostconfig['DnsSearch'] = [];
              for (var i in DnsSearch)
                  hostconfig.DnsSearch.push(DnsSearch[i]);
          }

          var ExtraHosts = inputs.HostConfig.ExtraHosts;
          if (ExtraHosts.length >= 1 && ExtraHosts[0] != "") {
              hostconfig['ExtraHosts'] = [];
              for (var i in ExtraHosts)
                  hostconfig.ExtraHosts.push(ExtraHosts[i]);
          }

          var GroupAdd = inputs.HostConfig.GroupAdd;
          if (GroupAdd.length >= 1 && GroupAdd[0] != "") {
              hostconfig['GroupAdd'] = [];
              for (var i in GroupAdd)
                  hostconfig.GroupAdd.push(GroupAdd[i]);
          }

          var Links = inputs.HostConfig.Links;
          if (Links.length >= 1 && Links[0] != "") {
              hostconfig['Links'] = [];
              for (var i in Links)
                  hostconfig.Links.push(Links[i]);
          }

          var SecurityOpt = inputs.HostConfig.SecurityOpt;
          if (SecurityOpt.length >= 1 && SecurityOpt[0] != "") {
              hostconfig['SecurityOpt'] = [];
              for (var i in SecurityOpt)
                  hostconfig.SecurityOpt.push(SecurityOpt[i]);
          }

          var MaskedPaths = inputs.HostConfig.MaskedPaths;
          if (MaskedPaths.length >= 1 && MaskedPaths[0] != "") {
              hostconfig['MaskedPaths'] = [];
              for (var i in MaskedPaths)
                  hostconfig.MaskedPaths.push(MaskedPaths[i]);
          }

          var ReadonlyPaths = inputs.HostConfig.ReadonlyPaths;
          if (ReadonlyPaths.length >= 1 && ReadonlyPaths[0] != "") {
              hostconfig['ReadonlyPaths'] = [];
              for (var i in ReadonlyPaths)
                  hostconfig.ReadonlyPaths.push(ReadonlyPaths[i]);
          }

          var ConsoleSize = inputs.HostConfig.ConsoleSize;
          hostconfig['ConsoleSize'] = [];
          for (var i in ConsoleSize)
              hostconfig.ConsoleSize.push(parseInt(ConsoleSize[i]));

          var StorageOpt = {};
          for (var i in inputs.HostConfig.StorageOpt)
              if (inputs.HostConfig.StorageOpt[i].key)
                  StorageOpt[inputs.HostConfig.StorageOpt[i].key] = inputs.HostConfig.StorageOpt[i].value;
          hostconfig['StorageOpt'] = StorageOpt;

          var Tmpfs = {};
          for (var i in inputs.HostConfig.Tmpfs)
              if (inputs.HostConfig.Tmpfs[i].key)
                  Tmpfs[inputs.HostConfig.Tmpfs[i].key] = inputs.HostConfig.Tmpfs[i].value;
          hostconfig['Tmpfs'] = Tmpfs;

          var Sysctls = {};
          for (var i in inputs.HostConfig.Sysctls)
              if (inputs.HostConfig.Sysctls[i].key)
                  Sysctls[inputs.HostConfig.Sysctls[i].key] = inputs.HostConfig.Sysctls[i].value;
          hostconfig['Sysctls'] = Sysctls;

          json_data['HostConfig'] = hostconfig;

          var networkingconfig = {};
          var EndpointsConfig = {};
          var flag = false;

          for (var i in inputs.NetworkingConfig.EndpointsConfig) {
              if (inputs.NetworkingConfig.EndpointsConfig[i].key) {
                  var port_value = inputs.NetworkingConfig.EndpointsConfig[i].value;
                  var Value = {};
                  for (var j in port_value) {
                      Value['NetworkID'] = port_value[j].NetworkID ? port_value[j].NetworkID :
                          undefined;
                      Value['EndpointID'] = port_value[j].EndpointID ? port_value[j].EndpointID :
                          undefined;
                      Value['Gateway'] = port_value[j].Gateway ? port_value[j].Gateway : undefined;
                      Value['IPAddress'] = port_value[j].IPAddress ? port_value[j].IPAddress :
                          undefined;
                      Value['IPv6Gateway'] = port_value[j].IPv6Gateway ? port_value[j].IPv6Gateway :
                          undefined;
                      Value['GlobalIPv6Address'] = port_value[j].GlobalIPv6Address ? port_value[j]
                          .GlobalIPv6Address : undefined;
                      Value['MacAddress'] = port_value[j].MacAddress ? port_value[j].MacAddress :
                          undefined;
                      Value['IPPrefixLen'] = port_value[j].IPPrefixLen ? parseInt(port_value[j]
                          .IPPrefixLen) : undefined;
                      Value['GlobalIPv6PrefixLen'] = port_value[j].GlobalIPv6PrefixLen ? parseInt(
                          port_value[j].GlobalIPv6PrefixLen) : undefined;

                      if (port_value[j].Links.length >= 1 && port_value[j].Links[0] != "") {
                          Value['Links'] = [];
                          for (var k in port_value[j].Links)
                              Value.port_value[j].Links.push(port_value[j].Links[k]);
                      }

                      if (port_value[j].Aliases.length >= 1 && port_value[j].Aliases[0] != "") {
                          Value['Aliases'] = [];
                          for (var k in port_value[j].Aliases)
                              Value.port_value[j].Aliases.push(port_value[j].Aliases[k]);
                      }

                      var IPAMConfig = {};
                      IPAMConfig['IPv4Address'] = port_value[j].IPAMConfig.IPv4Address ? port_value[j]
                          .IPAMConfig.IPv4Address : undefined;
                      IPAMConfig['IPv6Address'] = port_value[j].IPAMConfig.IPv6Address ? port_value[j]
                          .IPAMConfig.IPv6Address : undefined;

                      var LinkLocalIPs = port_value[j].IPAMConfig.LinkLocalIPs;
                      if (LinkLocalIPs.length >= 1 && LinkLocalIPs[0] != "") {
                          IPAMConfig['LinkLocalIPs'] = [];
                          for (var k in LinkLocalIPs)
                              IPAMConfig.LinkLocalIPs.push(LinkLocalIPs[k]);
                      }

                      Value['IPAMConfig'] = IPAMConfig;

                      var DriverOpts = {};
                      for (var k in port_value[j].DriverOpts)
                          DriverOpts[port_value[j].DriverOpts[k].key] = port_value[j].DriverOpts[k].value;
                      Value['DriverOpts'] = DriverOpts;
                  }
                  flag = true;
                  EndpointsConfig[inputs.NetworkingConfig.EndpointsConfig[i].key] = Value;
              }
          }

          if (flag == true) {
              networkingconfig['EndpointsConfig'] = EndpointsConfig;
              json_data['NetworkingConfig'] = networkingconfig;
          }

          if (inputs.additional_fields)
              json_data = new DockerUtils().parseAdditionalFields(inputs.additional_fields,
                  json_data);

          return json_data;
      } catch (err) {
          throw ('Invalid value provided in input variables, kindly check and try again');
      }
  },

  updateServicePayload: function(inputs) {
      var json_data = {};
      json_data.Name = inputs.name ? inputs.name : undefined;

      var labels = {};
      for (var i in inputs.Labels)
          if (inputs.Labels[i].key)
              labels[inputs.Labels[i].key] = inputs.Labels[i].value;
      json_data['Labels'] = labels;

      var TaskTemplate = {};
      TaskTemplate['ForceUpdate'] = inputs.TaskTemplate.ForceUpdate ? parseInt(inputs.TaskTemplate.ForceUpdate) : undefined;
      TaskTemplate['Runtime'] = inputs.TaskTemplate.Runtime ? inputs.TaskTemplate.Runtime : undefined;

      var PluginSpec = {};
      PluginSpec['Name'] = inputs.TaskTemplate.PluginSpec.Name ? inputs.TaskTemplate.PluginSpec.Name : undefined;
      PluginSpec['Remote'] = inputs.TaskTemplate.PluginSpec.Remote ? inputs.TaskTemplate.PluginSpec.Remote : undefined;
      PluginSpec['Disabled'] = Boolean(inputs.TaskTemplate.PluginSpec.Disabled);

      var PluginPrivilege = {};
      var PluginSpecFlag = false;
      for (var i in inputs.TaskTemplate.PluginSpec.PluginPrivilege) {
          if (inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Name) {
              PluginPrivilege[inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Name] = inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Name ? inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Name : undefined;
              PluginPrivilege[inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Description] = inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Description ? inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Description : undefined;

              var Value = inputs.TaskTemplate.PluginSpec.PluginPrivilege[i].Value;
              if (Value.length >= 1 && Value[0] != "") {
                  PluginPrivilege['Value'] = [];
                  for (var j in Value)
                      PluginPrivilege.Value.push(Value[j]);
              }
              PluginSpecFlag = true;
          }
      }
      if (PluginSpecFlag === true)
          PluginSpec['PluginPrivilege'] = PluginPrivilege;

      if (inputs.TaskTemplate.PluginSpec.Name || inputs.TaskTemplate.PluginSpec.Remote || PluginSpecFlag === true)
          TaskTemplate['PluginSpec'] = PluginSpec;

      var ContainerSpec = {};
      ContainerSpec['Image'] = inputs.TaskTemplate.ContainerSpec.Image ? inputs.TaskTemplate.ContainerSpec.Image : undefined;
      ContainerSpec['Hostname'] = inputs.TaskTemplate.ContainerSpec.Hostname ? inputs.TaskTemplate.ContainerSpec.Hostname : undefined;
      ContainerSpec['Dir'] = inputs.TaskTemplate.ContainerSpec.Dir ? inputs.TaskTemplate.ContainerSpec.Dir : undefined;
      ContainerSpec['User'] = inputs.TaskTemplate.ContainerSpec.User ? inputs.TaskTemplate.ContainerSpec.User : undefined;
      ContainerSpec['TTY'] = new DockerUtils().checkBooleanValue(inputs.TaskTemplate.ContainerSpec.TTY);
      ContainerSpec['OpenStdin'] = new DockerUtils().checkBooleanValue(inputs.TaskTemplate.ContainerSpec.OpenStdin);
      ContainerSpec['ReadOnly'] = new DockerUtils().checkBooleanValue(inputs.TaskTemplate.ContainerSpec.ReadOnly);
      ContainerSpec['StopSignal'] = inputs.TaskTemplate.ContainerSpec.StopSignal ? inputs.TaskTemplate.ContainerSpec.StopSignal : undefined;
      ContainerSpec['StopGracePeriod'] = inputs.TaskTemplate.ContainerSpec.StopGracePeriod ? parseInt(inputs.TaskTemplate.ContainerSpec.StopGracePeriod) : undefined;
      ContainerSpec['Isolation'] = inputs.TaskTemplate.ContainerSpec.Isolation ? inputs.TaskTemplate.ContainerSpec.Isolation : undefined;
      ContainerSpec['Init'] = new DockerUtils().checkBooleanValue(inputs.TaskTemplate.ContainerSpec.Init);

      var Command = inputs.TaskTemplate.ContainerSpec.Command;
      if (Command.length >= 1 && Command[0] != "") {
          ContainerSpec['Command'] = [];
          for (var i in Command)
              ContainerSpec.Command.push(Command[i]);
      }

      var Args = inputs.TaskTemplate.ContainerSpec.Args;
      if (Args.length >= 1 && Args[0] != "") {
          ContainerSpec['Args'] = [];
          for (var i in Args)
              ContainerSpec.Args.push(Args[i]);
      }

      var Env = inputs.TaskTemplate.ContainerSpec.Env;
      if (Env.length >= 1 && Env[0] != "") {
          ContainerSpec['Env'] = [];
          for (var i in Env)
              ContainerSpec.Env.push(Env[i]);
      }

      var Groups = inputs.TaskTemplate.ContainerSpec.Groups;
      if (Groups.length >= 1 && Groups[0] != "") {
          ContainerSpec['Groups'] = [];
          for (var i in Groups)
              ContainerSpec.Groups.push(Groups[i]);
      }

      var Hosts = inputs.TaskTemplate.ContainerSpec.Hosts;
      if (Hosts.length >= 1 && Hosts[0] != "") {
          ContainerSpec['Hosts'] = [];
          for (var i in Hosts)
              ContainerSpec.Hosts.push(Hosts[i]);
      }

      var CapabilityAdd = inputs.TaskTemplate.ContainerSpec.CapabilityAdd;
      if (CapabilityAdd.length >= 1 && CapabilityAdd[0] != "") {
          ContainerSpec['CapabilityAdd'] = [];
          for (var i in CapabilityAdd)
              ContainerSpec.CapabilityAdd.push(CapabilityAdd[i]);
      }

      var CapabilityDrop = inputs.TaskTemplate.ContainerSpec.CapabilityDrop;
      if (CapabilityDrop.length >= 1 && CapabilityDrop[0] != "") {
          ContainerSpec['CapabilityDrop'] = [];
          for (var i in CapabilityDrop)
              ContainerSpec.CapabilityDrop.push(CapabilityDrop[i]);
      }

      var labels = {};
      for (var i in inputs.TaskTemplate.ContainerSpec.Labels)
          if (inputs.TaskTemplate.ContainerSpec.Labels[i].key)
              labels[inputs.TaskTemplate.ContainerSpec.Labels[i].key] = inputs.TaskTemplate.ContainerSpec.Labels[i].value;
      ContainerSpec['Labels'] = labels;

      var Privileges = {};
      var privilege = inputs.TaskTemplate.ContainerSpec.Privileges;
      var CredentialSpec = {};
      var CredentialSpecFlag = false;
      CredentialSpec['Config'] = privilege.CredentialSpec.Config ? privilege.CredentialSpec.Config : undefined;
      CredentialSpec['File'] = privilege.CredentialSpec.File ? privilege.CredentialSpec.File : undefined;
      CredentialSpec['Registry'] = privilege.CredentialSpec.Registry ? privilege.CredentialSpec.Registry : undefined;
      if (privilege.CredentialSpec.Config || privilege.CredentialSpec.File || privilege.CredentialSpec.Registry) {
          Privileges['CredentialSpec'] = CredentialSpec;
          CredentialSpecFlag = true;
      }

      var SELinuxContext = {};
      var SELinuxContextFlag = false;
      SELinuxContext['Disable'] = Boolean(privilege.SELinuxContext.Disable);
      SELinuxContext['User'] = privilege.SELinuxContext.User ? privilege.SELinuxContext.User : undefined;
      SELinuxContext['Role'] = privilege.SELinuxContext.Role ? privilege.SELinuxContext.Role : undefined;
      SELinuxContext['Type'] = privilege.SELinuxContext.Type ? privilege.SELinuxContext.Type : undefined;
      SELinuxContext['Level'] = privilege.SELinuxContext.Level ? privilege.SELinuxContext.Level : undefined;
      if (privilege.SELinuxContext.User && privilege.SELinuxContext.Role && privilege.SELinuxContext.Type && privilege.SELinuxContext.Level) {
          Privileges['SELinuxContext'] = SELinuxContext;
          SELinuxContextFlag = true;
      }

      if (CredentialSpecFlag === true || SELinuxContextFlag === true)
          ContainerSpec['Privileges'] = Privileges;

      ContainerSpec['Mounts'] = [];
      for (var i in inputs.TaskTemplate.ContainerSpec.Mounts) {
          var Mounts = {};
          var mount = inputs.TaskTemplate.ContainerSpec.Mounts[i];
          Mounts['Target'] = mount.Target ? mount.Target : undefined;
          Mounts['Source'] = mount.Source ? mount.Source : undefined;
          Mounts['Type'] = mount.Type ? mount.Type : undefined;
          Mounts['ReadOnly'] = new DockerUtils().checkBooleanValue(mount.ReadOnly);
          Mounts['Consistency'] = mount.Consistency ? mount.Consistency : undefined;

          var BindOptions = {};
          var BindFlag = false;
          if (mount.BindOptions.Propagation && mount.BindOptions.NonRecursive) {
              BindOptions['Propagation'] = mount.BindOptions.Propagation ? mount.BindOptions.Propagation : undefined;
              BindOptions['NonRecursive'] = new DockerUtils().checkBooleanValue(mount.BindOptions.NonRecursive);
              BindFlag = true;
              Mounts['BindOptions'] = BindOptions;
          }

          var VolumeOptions = {};
          var VolumeFlag = false;
          var VolumeOptionsFlag = false;
          VolumeOptions['NoCopy'] = new DockerUtils().checkBooleanValue(mount.VolumeOptions.NoCopy);
          var VolumeOptionsLabels = {};
          for (var j in mount.VolumeOptions.Labels)
              if (mount.VolumeOptions.Labels[j].key) {
                  VolumeOptionsLabels[mount.VolumeOptions.Labels[j].key] = mount.VolumeOptions.Labels[j].value;
                  VolumeOptionsFlag = true;
              }
          if (VolumeOptionsFlag == true)
              VolumeOptions['Labels'] = VolumeOptionsLabels;

          var VolumeOptionsDriverConfig = {};
          VolumeOptionsDriverConfig['Name'] = mount.VolumeOptions.DriverConfig
              .Name ? mount.VolumeOptions.DriverConfig.Name : undefined;
          var OptionsFlag = false;
          for (var j in mount.VolumeOptions.DriverConfig.Options) {
              if (mount.VolumeOptions.DriverConfig.Options[j].key) {
                  var VolumeOptionsDriverConfigOptions = {};
                  VolumeOptionsDriverConfigOptions[mount.VolumeOptions
                          .DriverConfig.Options[j].key] = mount.VolumeOptions
                      .DriverConfig.Options[j].value;

                  VolumeOptionsDriverConfig['Options'] = VolumeOptionsDriverConfigOptions;
                  OptionsFlag = true;
              }
          }
          if (VolumeOptionsDriverConfig.Name && OptionsFlag == true)
              VolumeOptions['DriverConfig'] = VolumeOptionsDriverConfig;

          if (VolumeOptions.DriverConfig && VolumeOptions.Labels) {
              Mounts['VolumeOptions'] = VolumeOptions;
              VolumeFlag = true;
          }

          var TmpfsOptions = {};
          var TmpfsFlag = false;
          TmpfsOptions['SizeBytes'] = mount.TmpfsOptions.SizeBytes ? parseInt(mount.TmpfsOptions.SizeBytes) : undefined;
          TmpfsOptions['Mode'] = mount.TmpfsOptions.Mode ? parseInt(mount.TmpfsOptions.Mode) : undefined;
          if (mount.TmpfsOptions.SizeBytes && mount.TmpfsOptions.Mode) {
              Mounts['TmpfsOptions'] = TmpfsOptions;
              TmpfsFlag = true;
          }

          if (mount.Target || mount.Source || mount.Type || mount.ReadOnly || mount.Consistency || BindFlag === true || VolumeFlag === true || TmpfsFlag === true)
              ContainerSpec.Mounts.push(Mounts);
      }

      var healthcheck = {};
      var test = inputs.TaskTemplate.ContainerSpec.HealthCheck.Test;
      var testFlag = false;
      if (test.length >= 1 && test[0] != "") {
          healthcheck['Test'] = [];
          for (var i in test) {
              healthcheck.Test.push(test[i]);
              testFlag = true;
          }
      }
      var health = inputs.TaskTemplate.ContainerSpec.HealthCheck;
      healthcheck['Interval'] = health.Interval ? parseInt(health.Interval) : undefined;
      healthcheck['Timeout'] = health.Timeout ? parseInt(health.Timeout) : undefined;
      healthcheck['Retries'] = health.Retries ? parseInt(health.Retries) : undefined;
      healthcheck['StartPeriod'] = health.StartPeriod ? parseInt(health.StartPeriod) : undefined;
      if (health.Interval || health.Timeout || health.Retries || health.StartPeriod || testFlag === true)
          ContainerSpec['HealthCheck'] = healthcheck;

      var DNSConfig = {};
      var Nameservers = inputs.TaskTemplate.ContainerSpec.DNSConfig.Nameservers;
      var NameserversFlag = false;
      if (Nameservers.length >= 1 && Nameservers[0] != "") {
          DNSConfig['Nameservers'] = [];
          for (var i in Nameservers) {
              DNSConfig.Nameservers.push(Nameservers[i]);
              NameserversFlag = true;
          }
      }

      var Search = inputs.TaskTemplate.ContainerSpec.DNSConfig.Search;
      var SearchFlag = false;
      if (Search.length >= 1 && Search[0] != "") {
          DNSConfig['Search'] = [];
          for (var i in Search) {
              DNSConfig.Search.push(Search[i]);
              SearchFlag = true;
          }
      }

      var Options = inputs.TaskTemplate.ContainerSpec.DNSConfig.Options;
      var OptionsFlag = false;
      if (Options.length >= 1 && Options[0] != "") {
          DNSConfig['Options'] = [];
          for (var i in Options) {
              DNSConfig.Options.push(Options[i]);
              OptionsFlag = true;
          }
      }

      if (NameserversFlag === true || SearchFlag === true || OptionsFlag === true)
          ContainerSpec['DNSConfig'] = DNSConfig;

      ContainerSpec['Secrets'] = [];
      for (var i in inputs.TaskTemplate.ContainerSpec.Secrets) {
          var Secrets = {};
          var secret = inputs.TaskTemplate.ContainerSpec.Secrets[i];
          Secrets['SecretID'] = secret.SecretID ? secret.SecretID : undefined;
          Secrets['SecretName'] = secret.SecretName ? secret.SecretName : undefined;

          var File = {};
          File['Name'] = secret.File.Name ? secret.File.Name : undefined;
          File['UID'] = secret.File.UID ? secret.File.UID : undefined;
          File['GID'] = secret.File.GID ? secret.File.GID : undefined;
          File['Mode'] = secret.File.Mode ? parseInt(secret.File.Mode) : undefined;
          if (secret.File.Name || secret.File.UID || secret.File.GID || secret.File.Mode)
              Secrets['File'] = File;

          if (secret.SecretID || secret.SecretName)
              ContainerSpec.Secrets.push(Secrets);
      }

      ContainerSpec['Configs'] = [];
      for (var i in inputs.TaskTemplate.ContainerSpec.Configs) {
          var Configs = {};
          var config = inputs.TaskTemplate.ContainerSpec.Configs[i];
          Configs['ConfigID'] = config.ConfigID ? config.ConfigID : undefined;
          Configs['ConfigName'] = config.ConfigName ? config.ConfigName : undefined;
          Configs['Runtime'] = config.Runtime ? JSON.parse(config.Runtime) : undefined;

          var File = {};
          File['Name'] = config.File.Name ? config.File.Name : undefined;
          File['UID'] = config.File.UID ? config.File.UID : undefined;
          File['GID'] = config.File.GID ? config.File.GID : undefined;
          File['Mode'] = config.File.Mode ? parseInt(config.File.Mode) : undefined;
          if (config.File.Name || config.File.UID || config.File.GID || config.File.Mode)
              Configs['File'] = File;

          if (config.ConfigID || config.ConfigName)
              ContainerSpec.Configs.push(Configs);
      }

      var Sysctls = {};
      for (var i in inputs.TaskTemplate.ContainerSpec.Sysctls)
          if (inputs.TaskTemplate.ContainerSpec.Sysctls[i].key)
              labels[inputs.TaskTemplate.ContainerSpec.Sysctls[i].key] = inputs.TaskTemplate.ContainerSpec.Sysctls[i].value;
      ContainerSpec['Sysctls'] = Sysctls;

      ContainerSpec['Ulimits'] = [];
      for (var i in inputs.TaskTemplate.ContainerSpec.Ulimits) {
          var Ulimits = {};
          var ulimit = inputs.TaskTemplate.ContainerSpec.Ulimits[i];
          Ulimits['Name'] = ulimit.Name ? ulimit.Name : undefined;
          Ulimits['Soft'] = ulimit.Soft ? parseInt(ulimit.Soft) : undefined;
          Ulimits['Hard'] = ulimit.Hard ? parseInt(ulimit.Hard) : undefined;
          if (ulimit.Name && ulimit.Soft && ulimit.Hard)
              ContainerSpec.Ulimits.push(Ulimits);
      }

      if (inputs.TaskTemplate.ContainerSpec.Image)
          TaskTemplate['ContainerSpec'] = ContainerSpec;

      var NetworkAttachmentSpec = {};
      NetworkAttachmentSpec['Mode'] = inputs.TaskTemplate.NetworkAttachmentSpec.Mode ? parseInt(inputs.TaskTemplate.NetworkAttachmentSpec.Mode) : undefined;
      if (inputs.TaskTemplate.NetworkAttachmentSpec.Mode)
          TaskTemplate['NetworkAttachmentSpec'] = NetworkAttachmentSpec;

      var Resources = {};
      var Limits = {};
      var limit = inputs.TaskTemplate.Resources.Limits;
      Limits['NanoCPUs'] = limit.NanoCPUs ? parseInt(limit.NanoCPUs) : undefined;
      Limits['MemoryBytes'] = limit.MemoryBytes ? parseInt(limit.MemoryBytes) : undefined;
      Limits['Pids'] = limit.Pids ? parseInt(limit.Pids) : undefined;
      if (limit.NanoCPUs || limit.MemoryBytes || limit.Pids)
          Resources['Limits'] = Limits;

      var Reservation = {};
      var reserv = inputs.TaskTemplate.Resources.Reservation;
      Reservation['NanoCPUs'] = reserv.NanoCPUs ? parseInt(reserv.NanoCPUs) : undefined;
      Reservation['MemoryBytes'] = reserv.MemoryBytes ? parseInt(reserv.MemoryBytes) : undefined;

      Reservation['GenericResources'] = [];
      var GenericFlag = false;
      for (var i in inputs.TaskTemplate.Resources.Reservation.GenericResources) {
          var GenericResources = {};
          var genericR = inputs.TaskTemplate.Resources.Reservation.GenericResources[i];

          var NamedResourceSpec = {};
          var NamedResourceFlag = false;
          NamedResourceSpec['Kind'] = genericR.NamedResourceSpec.Kind ? genericR.NamedResourceSpec.Kind : undefined;
          NamedResourceSpec['Value'] = genericR.NamedResourceSpec.Value ? genericR.NamedResourceSpec.Value : undefined;
          if (genericR.NamedResourceSpec.Kind && genericR.NamedResourceSpec.Value) {
              GenericResources['NamedResourceSpec'] = NamedResourceSpec;
              NamedResourceFlag = true;
          }

          var DiscreteResourceSpec = {};
          var DiscreteResourceFlag = false;
          DiscreteResourceSpec['Kind'] = genericR.DiscreteResourceSpec.Kind ? genericR.DiscreteResourceSpec.Kind : undefined;
          DiscreteResourceSpec['Value'] = genericR.DiscreteResourceSpec.Value ? parseInt(genericR.DiscreteResourceSpec.Value) : undefined;
          if (genericR.DiscreteResourceSpec.Kind && genericR.DiscreteResourceSpec.Value) {
              GenericResources['DiscreteResourceSpec'] = DiscreteResourceSpec;
              DiscreteResourceFlag = true;
          }

          if (NamedResourceFlag === true && DiscreteResourceFlag === true)
              Reservation.GenericResources.push(GenericResources);

          GenericFlag = true;
      }

      if (limit.NanoCPUs || limit.MemoryBytes || GenericFlag === true)
          Resources['Reservation'] = Reservation;

      if (Resources.Limits || Resources.Reservation)
          TaskTemplate['Resources'] = Resources;

      var RestartPolicy = {};
      var restartP = inputs.TaskTemplate.RestartPolicy;
      RestartPolicy['Condition'] = restartP.Condition ? restartP.Condition : undefined;
      RestartPolicy['Delay'] = restartP.Delay ? parseInt(restartP.Delay) : undefined;
      RestartPolicy['MaxAttempts'] = restartP.MaxAttempts ? parseInt(restartP.MaxAttempts) : undefined;
      RestartPolicy['Window'] = restartP.Window ? parseInt(restartP.Window) : undefined;
      if (restartP.Condition || restartP.Delay || restartP.MaxAttempts || restartP.Window)
          TaskTemplate['RestartPolicy'] = RestartPolicy;

      var Placement = {};
      var placeM = inputs.TaskTemplate.Placement;
      Placement['MaxReplicas'] = placeM.MaxReplicas ? parseInt(placeM.MaxReplicas) : undefined;

      var Constraints = placeM.Constraints;
      var constraintsFlag = false;
      if (Constraints.length >= 1 && Constraints[0] != "") {
          Placement['Constraints'] = [];
          for (var i in Constraints) {
              Placement.Constraints.push(Constraints[i]);
              constraintsFlag = true;
          }
      }

      Placement['Preferences'] = [];
      var PreferencesFlag = false;
      for (var i in placeM.Preferences) {
          var Preferences = {};
          var prefer = placeM.Preferences[i];
          var Spread = {};
          Spread['SpreadDescriptor'] = prefer.Spread.SpreadDescriptor ? prefer.Spread.SpreadDescriptor : undefined;
          if (prefer.Spread.SpreadDescriptor)
              Preferences['Spread'] = Spread;

          if (prefer.Spread) {
              Placement.Preferences.push(Preferences);
              PreferencesFlag = true;
          }
      }

      Placement['Platforms'] = [];
      var PlatformsFlag = false;
      for (var i in placeM.Platforms) {
          var Platforms = {};
          var platF = placeM.Platforms[i];
          Platforms['Architecture'] = platF.Architecture ? platF.Architecture : undefined;
          Platforms['OS'] = platF.OS ? platF.OS : undefined;

          if (platF.Architecture || platF.OS) {
              Placement.Platforms.push(Platforms);
              PlatformsFlag = true;
          }
      }

      if (placeM.MaxReplicas || constraintsFlag === true || PreferencesFlag === true || PlatformsFlag === true)
          TaskTemplate['Placement'] = Placement;

      TaskTemplate['Networks'] = [];
      var NetworksFlag = false;
      for (var i in inputs.TaskTemplate.Networks) {
          var Networks = {};
          var network = inputs.TaskTemplate.Networks[i];
          Networks['Target'] = network.Target ? network.Target : undefined;

          var Aliases = network.Aliases;
          var AliasesFlag = false;
          if (Aliases.length >= 1 && Aliases[0] != "") {
              Networks['Aliases'] = [];
              for (var i in Aliases) {
                  Networks.Aliases.push(Aliases[i]);
                  AliasesFlag = true;
              }
          }

          var DriverOpts = {};
          var DriverOptsFlag = false;
          for (var j in network.DriverOpts)
              if (network.DriverOpts[j].key) {
                  DriverOpts[network.DriverOpts[j].key] = network.DriverOpts[j].value;
                  DriverOptsFlag = true;
              }
          if (DriverOptsFlag === true)
              Networks['DriverOpts'] = DriverOpts;

          if (network.Target || AliasesFlag === true || DriverOptsFlag === true) {
              TaskTemplate.Networks.push(Networks);
              NetworksFlag = true;
          }
      }

      var LogDriver = {};
      LogDriver['Name'] = inputs.TaskTemplate.LogDriver.Name ? inputs.TaskTemplate.LogDriver.Name : undefined;

      var Options = {};
      var OptionsFlag = false;
      for (var i in inputs.TaskTemplate.LogDriver.Options)
          if (inputs.TaskTemplate.LogDriver.Options[i].key) {
              Options[inputs.TaskTemplate.LogDriver.Options[i].key] = inputs.TaskTemplate.LogDriver.Options[i].value;
              OptionsFlag = true;
          }
      if (OptionsFlag === true)
          LogDriver['Options'] = Options;

      if (inputs.TaskTemplate.LogDriver.Name || OptionsFlag === true)
          TaskTemplate['LogDriver'] = LogDriver;

      if (inputs.TaskTemplate.ContainerSpec.Image)
          json_data['TaskTemplate'] = TaskTemplate;

      var Mode = {};
      var Replicated = {};
      if ((inputs.mode) && (inputs.mode.Replicated) && (inputs.mode.Replicated.Replicas))
          Replicated['Replicas'] = inputs.mode.Replicated.Replicas;
      else
          Replicated['Replicas'] = 0;
      Mode['Replicated'] = Replicated;
      json_data['Mode'] = Mode;

      var UpdateConfig = {};
      UpdateConfig['Parallelism'] = inputs.UpdateConfig.Parallelism ? parseInt(inputs.UpdateConfig.Parallelism) : undefined;
      UpdateConfig['Delay'] = inputs.UpdateConfig.Delay ? parseInt(inputs.UpdateConfig.Delay) : undefined;
      UpdateConfig['FailureAction'] = inputs.UpdateConfig.FailureAction ? inputs.UpdateConfig.FailureAction : undefined;
      UpdateConfig['Monitor'] = inputs.UpdateConfig.Monitor ? parseInt(inputs.UpdateConfig.Monitor) : undefined;
      UpdateConfig['MaxFailureRatio'] = inputs.UpdateConfig.MaxFailureRatio ? parseInt(inputs.UpdateConfig.MaxFailureRatio) : undefined;
      if (inputs.UpdateConfig.Parallelism || inputs.UpdateConfig.Delay || inputs.UpdateConfig.FailureAction || inputs.UpdateConfig.Monitor || inputs.UpdateConfig.MaxFailureRatio)
          json_data['UpdateConfig'] = UpdateConfig;

      var RollbackConfig = {};
      RollbackConfig['Parallelism'] = inputs.RollbackConfig.Parallelism ? parseInt(inputs.RollbackConfig.Parallelism) : undefined;
      RollbackConfig['Delay'] = inputs.RollbackConfig.Delay ? parseInt(inputs.RollbackConfig.Delay) : undefined;
      RollbackConfig['FailureAction'] = inputs.RollbackConfig.FailureAction ? inputs.RollbackConfig.FailureAction : undefined;
      RollbackConfig['Monitor'] = inputs.RollbackConfig.Monitor ? parseInt(inputs.RollbackConfig.Monitor) : undefined;
      RollbackConfig['MaxFailureRatio'] = inputs.RollbackConfig.MaxFailureRatio ? parseInt(inputs.RollbackConfig.MaxFailureRatio) : undefined;
      if (inputs.RollbackConfig.Parallelism || inputs.RollbackConfig.Delay || inputs.RollbackConfig.FailureAction || inputs.RollbackConfig.Monitor || inputs.RollbackConfig.MaxFailureRatio)
          json_data['RollbackConfig'] = RollbackConfig;

      json_data['Networks'] = [];
      for (var i in inputs.networks) {
          var Networks = {};
          var network = inputs.networks[i];
          Networks['Target'] = network.Target ? network.Target : undefined;

          if (network.Target)
              json_data.Networks.push(Networks);
      }

      var EndpointSpec = {};
      EndpointSpec['Mode'] = inputs.EndpointSpec.Mode ? inputs.EndpointSpec.Mode : undefined;

      EndpointSpec['Ports'] = [];
      var PortFlag = false;
      for (var i in inputs.EndpointSpec.Ports) {
          var Ports = {};
          var port = inputs.EndpointSpec.Ports[i];
          Ports['Name'] = port.Name ? port.Name : undefined;
          Ports['Protocol'] = port.Protocol ? port.Protocol : undefined;
          Ports['TargetPort'] = port.TargetPort ? parseInt(port.TargetPort) : undefined;
          Ports['PublishedPort'] = port.PublishedPort ? parseInt(port.PublishedPort) : undefined;
          Ports['PublishMode'] = port.PublishMode ? port.PublishMode : undefined;

          if (port.Target || port.Protocol || port.TargetPort || port.PublishedPort || port.PublishMode) {
              EndpointSpec.Ports.push(Ports);
              PortFlag = true;
          }
      }

      if (inputs.EndpointSpec.Mode || PortFlag === true)
          json_data['EndpointSpec'] = EndpointSpec;

      return json_data;
  },

  type: 'DockerUtils'
};

Sys ID

67bcacf1db831700dd14596e5e9619a8

Offical Documentation

Official Docs: