[ews-build] Add build step to Transfer archive to S3
https://bugs.webkit.org/show_bug.cgi?id=197922

Reviewed by Jonathan Bedard.

* BuildSlaveSupport/ews-build/steps.py:
(TransferToS3):
(TransferToS3.finished): Invoke triggers after transfer is successful.
(TransferToS3.getResultSummary): Create more readable failure string.
(UploadBuiltProduct.finished): Deleted. Moved the trigger invocation after TransferToS3.
* BuildSlaveSupport/ews-build/steps_unittest.py: Added unit-tests.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@245461 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Tools/BuildSlaveSupport/ews-build/steps.py b/Tools/BuildSlaveSupport/ews-build/steps.py
index b9930ea..e3d2b7a 100644
--- a/Tools/BuildSlaveSupport/ews-build/steps.py
+++ b/Tools/BuildSlaveSupport/ews-build/steps.py
@@ -615,7 +615,7 @@
             self.setProperty('patchFailedToBuild', True)
             self.build.addStepsAfterCurrentStep([UnApplyPatchIfRequired(), CompileWebKitToT()])
         else:
-            self.build.addStepsAfterCurrentStep([ArchiveBuiltProduct(), UploadBuiltProduct()])
+            self.build.addStepsAfterCurrentStep([ArchiveBuiltProduct(), UploadBuiltProduct(), TransferToS3()])
 
         return super(CompileWebKit, self).evaluateCommand(cmd)
 
@@ -769,18 +769,39 @@
         kwargs['blocksize'] = 1024 * 256
         transfer.FileUpload.__init__(self, **kwargs)
 
+    def getResultSummary(self):
+        if self.results != SUCCESS:
+            return {u'step': u'Failed to upload built product'}
+        return super(UploadBuiltProduct, self).getResultSummary()
+
+
+class TransferToS3(master.MasterShellCommand):
+    name = 'transfer-to-s3'
+    description = ['transferring to s3']
+    descriptionDone = ['Transferred archive to S3']
+    archive = WithProperties('public_html/archives/%(fullPlatform)s-%(architecture)s-%(configuration)s/%(patch_id)s.zip')
+    identifier = WithProperties('%(fullPlatform)s-%(architecture)s-%(configuration)s')
+    patch_id = WithProperties('%(patch_id)s')
+    command = ['python', '../Shared/transfer-archive-to-s3', '--patch_id', patch_id, '--identifier', identifier, '--archive', archive]
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, **kwargs):
+        kwargs['command'] = self.command
+        master.MasterShellCommand.__init__(self, logEnviron=False, **kwargs)
+
     def finished(self, results):
         if results == SUCCESS:
             triggers = self.getProperty('triggers', None)
             if triggers:
                 self.build.addStepsAfterCurrentStep([Trigger(schedulerNames=triggers)])
 
-        return super(UploadBuiltProduct, self).finished(results)
+        return super(TransferToS3, self).finished(results)
 
     def getResultSummary(self):
         if self.results != SUCCESS:
-            return {u'step': u'Failed to upload built product'}
-        return super(UploadBuiltProduct, self).getResultSummary()
+            return {u'step': u'Failed to transfer archive to S3'}
+        return super(TransferToS3, self).getResultSummary()
 
 
 class DownloadBuiltProduct(shell.ShellCommand):
diff --git a/Tools/BuildSlaveSupport/ews-build/steps_unittest.py b/Tools/BuildSlaveSupport/ews-build/steps_unittest.py
index f1af68f..c50d21a 100644
--- a/Tools/BuildSlaveSupport/ews-build/steps_unittest.py
+++ b/Tools/BuildSlaveSupport/ews-build/steps_unittest.py
@@ -40,8 +40,8 @@
                    DownloadBuiltProduct, ExtractBuiltProduct, ExtractTestResults, KillOldProcesses,
                    PrintConfiguration, ReRunAPITests, ReRunJavaScriptCoreTests, RunAPITests, RunAPITestsWithoutPatch,
                    RunBindingsTests, RunJavaScriptCoreTests, RunJavaScriptCoreTestsToT, RunWebKit1Tests, RunWebKitPerlTests,
-                   RunWebKitPyTests, RunWebKitTests, TestWithFailureCount, Trigger, UnApplyPatchIfRequired, UploadBuiltProduct,
-                   UploadTestResults, ValidatePatch)
+                   RunWebKitPyTests, RunWebKitTests, TestWithFailureCount, Trigger, TransferToS3, UnApplyPatchIfRequired,
+                   UploadBuiltProduct, UploadTestResults, ValidatePatch)
 
 # Workaround for https://github.com/buildbot/buildbot/issues/4669
 from buildbot.test.fake.fakebuild import FakeBuild
@@ -1073,6 +1073,51 @@
         return self.runStep()
 
 
+class TestTransferToS3(BuildStepMixinAdditions, unittest.TestCase):
+    def setUp(self):
+        self.longMessage = True
+        return self.setUpBuildStep()
+
+    def tearDown(self):
+        return self.tearDownBuildStep()
+
+    def test_success(self):
+        self.setupStep(TransferToS3())
+        self.setProperty('fullPlatform', 'mac-highsierra')
+        self.setProperty('configuration', 'release')
+        self.setProperty('architecture', 'x86_64')
+        self.setProperty('patch_id', '1234')
+        self.expectLocalCommands(
+            ExpectMasterShellCommand(command=['python',
+                                              '../Shared/transfer-archive-to-s3',
+                                              '--patch_id', '1234',
+                                              '--identifier', 'mac-highsierra-x86_64-release',
+                                              '--archive', 'public_html/archives/mac-highsierra-x86_64-release/1234.zip',
+                                             ])
+            + 0,
+        )
+        self.expectOutcome(result=SUCCESS, state_string='Transferred archive to S3')
+        return self.runStep()
+
+    def test_failure(self):
+        self.setupStep(TransferToS3())
+        self.setProperty('fullPlatform', 'ios-simulator-12')
+        self.setProperty('configuration', 'debug')
+        self.setProperty('architecture', 'x86_64')
+        self.setProperty('patch_id', '1234')
+        self.expectLocalCommands(
+            ExpectMasterShellCommand(command=['python',
+                                              '../Shared/transfer-archive-to-s3',
+                                              '--patch_id', '1234',
+                                              '--identifier', 'ios-simulator-12-x86_64-debug',
+                                              '--archive', 'public_html/archives/ios-simulator-12-x86_64-debug/1234.zip',
+                                             ])
+            + 2,
+        )
+        self.expectOutcome(result=FAILURE, state_string='Failed to transfer archive to S3')
+        return self.runStep()
+
+
 class TestRunAPITests(BuildStepMixinAdditions, unittest.TestCase):
     def setUp(self):
         self.longMessage = True
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index e5def46..3ae9ef4 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,17 @@
+2019-05-17  Aakash Jain  <aakash_jain@apple.com>
+
+        [ews-build] Add build step to Transfer archive to S3
+        https://bugs.webkit.org/show_bug.cgi?id=197922
+
+        Reviewed by Jonathan Bedard.
+
+        * BuildSlaveSupport/ews-build/steps.py:
+        (TransferToS3):
+        (TransferToS3.finished): Invoke triggers after transfer is successful.
+        (TransferToS3.getResultSummary): Create more readable failure string.
+        (UploadBuiltProduct.finished): Deleted. Moved the trigger invocation after TransferToS3.
+        * BuildSlaveSupport/ews-build/steps_unittest.py: Added unit-tests.
+
 2019-05-16  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] Need WebKitContextMenuItemType to open emoji picker