diff --git a/jobs/pipelines/swarm-deploy-platform.groovy b/jobs/pipelines/swarm-deploy-platform.groovy
index b8afc35..7377958 100644
--- a/jobs/pipelines/swarm-deploy-platform.groovy
+++ b/jobs/pipelines/swarm-deploy-platform.groovy
@@ -30,67 +30,68 @@
 def install_timeout = env.STACK_INSTALL_TIMEOUT.toInteger()
 
 timeout(time: install_timeout + 600, unit: 'SECONDS') {
-
-    node ("${PARENT_NODE_NAME}") {
-        if (! fileExists("${PARENT_WORKSPACE}")) {
-            error "'PARENT_WORKSPACE' contains path to non-existing directory ${PARENT_WORKSPACE} on the node '${PARENT_NODE_NAME}'."
-        }
-        dir("${PARENT_WORKSPACE}") {
-
-            if (! env.STACK_INSTALL) {
-                error "'STACK_INSTALL' must contain one or more comma separated stack names for [deploy_openstack] pipeline"
+    timestamps {
+        node ("${PARENT_NODE_NAME}") {
+            if (! fileExists("${PARENT_WORKSPACE}")) {
+                error "'PARENT_WORKSPACE' contains path to non-existing directory ${PARENT_WORKSPACE} on the node '${PARENT_NODE_NAME}'."
             }
+            dir("${PARENT_WORKSPACE}") {
 
-            if (env.TCP_QA_REFS) {
-                stage("Update working dir to patch ${TCP_QA_REFS}") {
-                    shared.update_working_dir()
-                }
-            }
-
-            try {
-                // Install the cluster
-                stage("Run Jenkins job on CICD [deploy_openstack:${env.STACK_INSTALL}]") {
-                    shared.run_job_on_cicd_nodes(env.STACK_INSTALL, install_timeout)
+                if (! env.STACK_INSTALL) {
+                    error "'STACK_INSTALL' must contain one or more comma separated stack names for [deploy_openstack] pipeline"
                 }
 
-                for (stack in "${env.STACK_INSTALL}".split(",")) {
-                    stage("Sanity check the deployed component [${stack}]") {
-                        shared.sanity_check_component(stack)
-
-                        // If oslo_config INI file ${ENV_NAME}_salt_deployed.ini exists,
-                        // then make a copy for the created snapshot to allow the system
-                        // tests to revert this snapshot along with the metadata from the INI file.
-                        shared.run_cmd("""\
-                            if [ -f \$(pwd)/${ENV_NAME}_salt_deployed.ini ]; then
-                                cp \$(pwd)/${ENV_NAME}_salt_deployed.ini \$(pwd)/${ENV_NAME}_${stack}_deployed.ini
-                            fi
-                        """)
-                    }
-                } // for
-
-                if (make_snapshot_stages) {
-                    stage("Make environment snapshots for [${env.STACK_INSTALL}]") {
-                        shared.devops_snapshot(env.STACK_INSTALL)
+                if (env.TCP_QA_REFS) {
+                    stage("Update working dir to patch ${TCP_QA_REFS}") {
+                        shared.update_working_dir()
                     }
                 }
 
-            } catch (e) {
-                common.printMsg("Job is failed", "purple")
-                shared.download_logs("deploy_platform_${ENV_NAME}")
-                throw e
-            } finally {
-                // TODO(ddmitriev): analyze the "def currentResult = currentBuild.result ?: 'SUCCESS'"
-                // and report appropriate data to TestRail
-                // TODO(ddmitriev): add checks for the installed stacks
-                if (make_snapshot_stages) {
-                    if ("${env.SHUTDOWN_ENV_ON_TEARDOWN}" == "true") {
-                        shared.run_cmd("""\
-                            dos.py destroy ${ENV_NAME}
-                        """)
+                try {
+                    // Install the cluster
+                    stage("Run Jenkins job on CICD [deploy_openstack:${env.STACK_INSTALL}]") {
+                        shared.run_job_on_cicd_nodes(env.STACK_INSTALL, install_timeout)
+                    }
+
+                    for (stack in "${env.STACK_INSTALL}".split(",")) {
+                        stage("Sanity check the deployed component [${stack}]") {
+                            shared.sanity_check_component(stack)
+
+                            // If oslo_config INI file ${ENV_NAME}_salt_deployed.ini exists,
+                            // then make a copy for the created snapshot to allow the system
+                            // tests to revert this snapshot along with the metadata from the INI file.
+                            shared.run_cmd("""\
+                                if [ -f \$(pwd)/${ENV_NAME}_salt_deployed.ini ]; then
+                                    cp \$(pwd)/${ENV_NAME}_salt_deployed.ini \$(pwd)/${ENV_NAME}_${stack}_deployed.ini
+                                fi
+                            """)
+                        }
+                    } // for
+
+                    if (make_snapshot_stages) {
+                        stage("Make environment snapshots for [${env.STACK_INSTALL}]") {
+                            shared.devops_snapshot(env.STACK_INSTALL)
+                        }
+                    }
+
+                } catch (e) {
+                    common.printMsg("Job is failed", "purple")
+                    shared.download_logs("deploy_platform_${ENV_NAME}")
+                    throw e
+                } finally {
+                    // TODO(ddmitriev): analyze the "def currentResult = currentBuild.result ?: 'SUCCESS'"
+                    // and report appropriate data to TestRail
+                    // TODO(ddmitriev): add checks for the installed stacks
+                    if (make_snapshot_stages) {
+                        if ("${env.SHUTDOWN_ENV_ON_TEARDOWN}" == "true") {
+                            shared.run_cmd("""\
+                                dos.py destroy ${ENV_NAME}
+                            """)
+                        }
                     }
                 }
-            }
 
-        } // dir
-    } // node
+            } // dir
+        } // node
+    } //timestamps
 } // timeout
\ No newline at end of file
