<?xml version="1.0" encoding="UTF-8"?>
<dsl-extension
    kind="projectFeature"
    type="storage_settings"
    generateDslJar="true"
    applicable="params['storage.type'] == 'S3_storage'">
  <class name="S3Storage">
    <description>
      Amazon S3 Artifact Storage
    </description>
  </class>

  <init>
    <param name="storage.type" value="S3_storage"/>
    <param name="storage.s3.bucket.name.wasProvidedAsString" dslName="nameAsString" type="boolean" value="true"/>
  </init>

  <function name="s3Storage">
    <description>
      Adds a Amazon S3 Artifact Storage project feature
      @see S3Storage
    </description>
  </function>

  <params>
    <param name="storage.name" dslName="storageName">
      <description>
        Storage name
      </description>
    </param>
    <param name="storage.s3.bucket.name" dslName="bucketName" mandatory="true">
      <description>
        Bucket name
      </description>
    </param>
    <param name="storage.s3.bucket.prefix" dslName="bucketPrefix">
      <description>
        Bucket path prefix
      </description>
    </param>
    <param name="storage.s3.upload.presignedUrl.enabled" dslName="enablePresignedURLUpload" type="boolean" trueValue="true" falseValue="">
      <description>
        Whether to use Pre-Signed URLs to upload
      </description>
    </param>
    <param name="storage.s3.forceVirtualHostAddressing" dslName="forceVirtualHostAddressing" type="boolean">
      <description>
        Whether to force Virtual Host Addressing
      </description>
    </param>
    <param name="storage.s3.accelerateModeEnabled" dslName="enableTransferAcceleration" type="boolean">
      <description>
        Whether to enable Transfer Acceleration
      </description>
    </param>
    <param name="storage.s3.upload.multipart_threshold" dslName="multipartThreshold">
      <description>
        Initiates multipart upload for files larger than the specified value.
        Minimum value is 5MB. Allowed suffixes: KB, MB, GB, TB.
        Leave empty to use the default value.
      </description>
    </param>
    <param name="storage.s3.upload.multipart_chunksize" dslName="multipartChunksize">
      <description>
        Specify the maximum allowed part size. Minimum value is 5MB.
        Allowed suffixes: KB, MB, GB, TB. Leave empty to use the default value.
      </description>
    </param>
    <param name="storage.s3.cloudfront.enabled" dslName="cloudFrontEnabled" type="boolean" trueValue="true" falseValue="">
      <description>
        Whether to use CloudFront for artifact transport
      </description>
    </param>
    <param name="storage.s3.cloudfront.upload.distribution" dslName="cloudFrontUploadDistribution" type="string">
      <description>
        Name of CloudFront distribution for uploads
      </description>
    </param>
    <param name="storage.s3.cloudfront.download.distribution" dslName="cloudFrontDownloadDistribution" type="string">
      <description>
        Name of CloudFront distribution for downloads
      </description>
    </param>
    <param name="storage.s3.cloudfront.publicKeyId" dslName="cloudFrontPublicKeyId" type="string">
      <description>
        Id of Public Key in CloudFront that has access to selected distribution
      </description>
    </param>
    <param name="secure:storage.s3.cloudfront.privateKey" dslName="cloudFrontPrivateKey">
      <description>
        Private key that corresponds to chosen public key
      </description>
    </param>
    <param name="storage.s3.verifyIntegrityAfterUpload" dslName="verifyIntegrityAfterUpload" type="boolean">
      <description>
        Whether to verify integrity of artifacts after upload
      </description>
    </param>
  </params>

  <examples>

    <example>
      <description>
        Adds new storage that allows TeamCity to store build artifacts in S3
      </description>
      <code>
        s3Storage {
          id = "S3_STORAGE_ID"
          storageName = "Storage Name"

          bucketName = "Bucket_Name"
          bucketPrefix = "path/prefix"

          forceVirtualHostAddressing = true
          enableTransferAcceleration = false
          multipartThreshold = "8MB"
          multipartChunksize = "8MB"

          // AWS S3 storage requires configured Credentials
          connectionId = "AWS Connection ID"
        }
      </code>
    </example>

    <example>
      <description>
        Adds new storage that allows TeamCity to store build artifacts in S3 and upload/download them using CloudFront
      </description>
      <code>
        s3Storage {
          id = "S3_STORAGE_ID"
          storageName = "Storage Name"
          bucketName = "Bucket_Name"
          bucketPrefix = "path/prefix"
          forceVirtualHostAddressing = true
          multipartThreshold = "6MB"
          multipartChunksize = "8MB"
          connectionId = "AWS Connection ID"

          //CloudFront configuration
          cloudFrontEnabled = true
          cloudFrontUploadDistribution = "ID of CloudFront Distribution used for uploads"
          cloudFrontDownloadDistribution = "ID of CloudFront Distribution used for downloads"
          cloudFrontPublicKeyId = "ID of CloudFront public key"
          cloudFrontPrivateKey = "credentialsJSON:CloudFront-private-key-link"
        }
      </code>
    </example>

    <example>
      <description>
        Adds new storage that allows TeamCity to store build artifacts in S3 and upload/download them with Transfer Acceleration
      </description>
      <code>
        s3Storage {
          id = "S3_STORAGE_ID"
          storageName = "Storage Name"
          bucketName = "Bucket_Name"
          connectionId = "AWS Connection ID"

          // must be set to true to enable Transfer Acceleration
          forceVirtualHostAddressing = true
          enableTransferAcceleration = true
        }
      </code>
    </example>

    <example>
      <description>
        S3 Storage. Disable integrity verification
      </description>
      <code>
        s3Storage {
          id = "S3_STORAGE_ID"
          storageName = "Storage Name"
          bucketName = "Bucket_Name"
          connectionId = "AWS Connection ID"

          verifyIntegrityAfterUpload = false
        }
      </code>
    </example>

    <example>
      <description>
        AWSEnvironment. Selects default environment with specific AWS region
      </description>
      <code>
        awsEnvironment = default {
          awsRegionName = ""
        }
      </code>
    </example>

    <example>
      <description>
        AWSEnvironment. Selects custom environment with specific region
      </description>
      <code>
        awsEnvironment = custom {
          endpoint = "URL of custom endpoint"
          awsRegionName = "region"
        }
      </code>
    </example>
  </examples>
</dsl-extension>
