export default function getToolLaunchingOptions()

in client/src/components/pipelines/launch/utilities/get-tool-launching-options.js [58:181]


export default function getToolLaunchingOptions (
  stores,
  tool,
  toolVersion = 'latest'
) {
  return new Promise((resolve, reject) => {
    const {
      awsRegions,
      preferences
    } = stores || {};
    if (!preferences) {
      reject(new Error('Error fetching preferences'));
      return;
    }
    if (!awsRegions) {
      reject(new Error('Error fetching cloud regions'));
      return;
    }
    const request = new LoadToolVersionSettings(tool.id);
    preferences
      .fetchIfNeededOrWait()
      .then(() => {
        if (preferences.error) {
          reject(new Error(preferences.error));
        } else if (!preferences.loaded) {
          reject(new Error('Error fetching preferences'));
        } else {
          return Promise.resolve();
        }
      })
      .then(() => awsRegions.fetchIfNeededOrWait())
      .then(() => {
        if (awsRegions.error) {
          reject(new Error(awsRegions.error));
        } else if (!awsRegions.loaded) {
          reject(new Error('Error fetching cloud regions'));
        } else {
          return Promise.resolve();
        }
      })
      .then(() => request.fetch())
      .then(() => {
        if (request.error) {
          reject(new Error(request.error));
        } else if (!request.loaded) {
          reject(new Error('Error fetching tool parameters'));
        } else {
          const options = (request.value || []).slice();
          const extractSettings = o => {
            if (!o || !o.settings || o.settings.length === 0) {
              return undefined;
            }
            return (
              o.settings.find(s => s.default) ||
              o.settings[0] ||
              {}
            ).configuration;
          };
          const latestVersion = extractSettings(options.find(o => o.version === 'latest'));
          const currentVersion = extractSettings(options.find(o => o.version === toolVersion));

          const versionSettingValue = (settingName) => {
            if (currentVersion) {
              return currentVersion[settingName];
            }
            if (latestVersion) {
              return latestVersion[settingName];
            }
            return null;
          };
          const defaultRegion = (awsRegions.value || []).find(r => r.default) || {};
          const cloudRegionIdValue = parameterIsNotEmpty(versionSettingValue('cloudRegionId'))
            ? versionSettingValue('cloudRegionId')
            : defaultRegion.id;
          const isSpotValue = parameterIsNotEmpty(versionSettingValue('is_spot'))
            ? versionSettingValue('is_spot')
            : preferences.useSpot;
          const allowedInstanceTypesRequest = new AllowedInstanceTypes({
            toolId: tool.id,
            regionId: cloudRegionIdValue,
            spot: isSpotValue
          });
          allowedInstanceTypesRequest
            .fetch()
            .then(() => {
              const payload = modifyPayloadForAllowedInstanceTypes({
                instanceType:
                  chooseDefaultValue(
                    versionSettingValue('instance_size'),
                    tool.instanceType,
                    preferences.getPreferenceValue('cluster.instance.type')
                  ),
                hddSize: +chooseDefaultValue(
                  versionSettingValue('instance_disk'),
                  tool.disk,
                  preferences.getPreferenceValue('cluster.instance.hdd'),
                  p => +p > 0
                ),
                timeout: +(tool.timeout || 0),
                cmdTemplate: chooseDefaultValue(
                  versionSettingValue('cmd_template'),
                  tool.defaultCommand,
                  preferences.getPreferenceValue('launch.cmd.template')
                ),
                dockerImage: tool.registry
                  ? `${tool.registry}/${tool.image}${toolVersion ? `:${toolVersion}` : ''}`
                  : `${tool.image}${toolVersion ? `:${toolVersion}` : ''}`,
                params: parameterIsNotEmpty(versionSettingValue('parameters'))
                  ? prepareParameters(versionSettingValue('parameters'))
                  : {},
                isSpot: isSpotValue,
                nodeCount: parameterIsNotEmpty(versionSettingValue('node_count'))
                  ? +versionSettingValue('node_count')
                  : undefined,
                cloudRegionId: cloudRegionIdValue
              }, allowedInstanceTypesRequest);
              resolve(payload);
            })
            .catch(reject);
        }
      })
      .catch(reject);
  });
}