Bug fix: Add timeout when setting Manual date & time

When time mode is initially set to Manual from NTP,
the NTP service is disabled. In this process, the NTP
service is stopping but not fully stopped therefore setting
date/time will return an error. There are no responses from
backend to notify when NTP is fully stopped. To work around,
a timeout is set to allow NTP to fully stop.

Signed-off-by: Dixsie Wolmers <dixsie@ibm.com>
Change-Id: I8873722a72a955c355114567e56205aff7819931
diff --git a/src/store/modules/Configuration/DateTimeSettingsStore.js b/src/store/modules/Configuration/DateTimeSettingsStore.js
index 9da0cb4..06aeefe 100644
--- a/src/store/modules/Configuration/DateTimeSettingsStore.js
+++ b/src/store/modules/Configuration/DateTimeSettingsStore.js
@@ -30,24 +30,41 @@
           console.log(error);
         });
     },
-    async updateDateTimeSettings(_, dateTimeForm) {
+    async updateDateTimeSettings({ state }, dateTimeForm) {
       const ntpData = {
         NTP: {
           ProtocolEnabled: dateTimeForm.ntpProtocolEnabled
         }
       };
-
       if (dateTimeForm.ntpProtocolEnabled) {
         ntpData.NTP.NTPServers = dateTimeForm.ntpServersArray;
       }
       return await api
         .patch(`/redfish/v1/Managers/bmc/NetworkProtocol`, ntpData)
-        .then(() => {
+        .then(async () => {
           if (!dateTimeForm.ntpProtocolEnabled) {
             const dateTimeData = {
               DateTime: dateTimeForm.updatedDateTime
             };
-            api.patch(`/redfish/v1/Managers/bmc`, dateTimeData);
+            /**
+             * https://github.com/openbmc/phosphor-time-manager/blob/master/README.md#special-note-on-changing-ntp-setting
+             * When time mode is initially set to Manual from NTP,
+             * NTP service is disabled and the NTP service is
+             * stopping but not stopped, setting time will return an error.
+             * There are no responses from backend to notify when NTP is stopped.
+             * To work around, a timeout is set to allow NTP to fully stop
+             * TODO: remove timeout if backend solves
+             * https://github.com/openbmc/openbmc/issues/3459
+             */
+            const timeoutVal = state.isNtpProtocolEnabled ? 20000 : 0;
+            return await new Promise((resolve, reject) => {
+              setTimeout(() => {
+                return api
+                  .patch(`/redfish/v1/Managers/bmc`, dateTimeData)
+                  .then(() => resolve())
+                  .catch(() => reject());
+              }, timeoutVal);
+            });
           }
         })
         .then(() => {
diff --git a/src/views/Configuration/DateTimeSettings/DateTimeSettings.vue b/src/views/Configuration/DateTimeSettings/DateTimeSettings.vue
index d7b97d1..7ce9cb3 100644
--- a/src/views/Configuration/DateTimeSettings/DateTimeSettings.vue
+++ b/src/views/Configuration/DateTimeSettings/DateTimeSettings.vue
@@ -330,6 +330,9 @@
             this.form.ntp.thirdAddress = '';
           }
         })
+        .then(() => {
+          this.$store.dispatch('global/getBmcTime');
+        })
         .catch(({ message }) => this.errorToast(message))
         .finally(() => {
           this.$v.form.$reset();