/// <summary>
        /// command specific implementation 
        /// </summary>
        internal override void commandImplementation()
        {
            BladeMultiRecordResponse myResponse = new BladeMultiRecordResponse();
            try
            {
                dynamic bladeId = null;
                dynamic payload = null;

                if (!(this.argVal.ContainsKey('i')))
                {
                    Console.WriteLine(WcsCliConstants.commandFailure +
                        " No blade ID specified, please look at command help");
                    return;
                }
                else
                {
                    this.argVal.TryGetValue('i', out bladeId);
                }

                if (!(this.argVal.ContainsKey('p')))
                {
                    Console.WriteLine(WcsCliConstants.commandFailure +
                        " No record data specified, please look at command help");
                    return;
                }
                else
                {
                    this.argVal.TryGetValue('p', out payload);
                }

                myResponse = WcsCli2CmConnectionManager.channel.SetBladeAssetInfo(
                    (int)bladeId, (string)payload);
            }

            catch (Exception ex)
            {
                SharedFunc.ExceptionOutput(ex);
                return;
            }

            ResponseValidation.ValidateResponse("Blade's FRU has been written successfully", myResponse, true);
        }
        /// <summary>
        /// Set the Multi Record Area portion of Blade FRU from user provided data
        /// </summary>
        /// <param name="bladeId"></param>
        /// <param name="recordData"></param>
        /// <returns>MultiRecordResponse</returns>
        public BladeMultiRecordResponse SetBladeAssetInfo(int bladeId, string recordData)
        {
            BladeMultiRecordResponse setBladeAsset = new BladeMultiRecordResponse();

            Tracer.WriteInfo("Invoked SetBladeAssetInfo() for blade Id {0}", bladeId);

            Contracts.ChassisResponse varResponse = ValidateRequest("SetBladeAssetInfo", bladeId);
            setBladeAsset.bladeNumber = bladeId;
            setBladeAsset.statusDescription = String.Empty;
            setBladeAsset.completionCode = Contracts.CompletionCode.Unknown;

            if (varResponse.completionCode != Contracts.CompletionCode.Success)
            {
                setBladeAsset.completionCode = varResponse.completionCode;
                setBladeAsset.statusDescription = varResponse.statusDescription;
                return setBladeAsset;
            }

            // Write to Blade Multi Record Area of FRU
            MultiRecordResponse status = WriteMultiRecordFru(bladeId, recordData, DeviceType.Server);

            if (status.completionCode == (byte)Contracts.CompletionCode.Success)
            {
                setBladeAsset.completionCode = Contracts.CompletionCode.Success;
            }
            else
            {
                setBladeAsset.completionCode = status.completionCode;
                setBladeAsset.statusDescription = status.statusDescription;
            }

            return setBladeAsset;
        }
        private void VerifyBladeFruWritesRemaining(ref bool allPassed, int BladeId)
        {
            bool testPassed;
            string currentApi = "SetBladeAssetInfo";
            BladeMultiRecordResponse bladeAssetInfoResponse = new BladeMultiRecordResponse();

            // Initialize FRU Writes Remaining Dictionary KeyValue Pair
            Dictionary <string, string> fruWritesRemainingKeyValue = new Dictionary<string,string>
            {
                {"ResetMultiRecordFruWritesRemaining", "0"}
            };

            // Set Channel for WcsCmAdmin User
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            if (!ConfigureAppConfig(fruWritesRemainingKeyValue, false))
            {
                CmTestLog.Failure(string.Format("{0}: Setting App.Config failed for KeyValue '{1},{2}'",
                    currentApi, fruWritesRemainingKeyValue.Keys.First(), fruWritesRemainingKeyValue.Values.First()));
                allPassed = false;
                return;
            }

            // Restart CM Service
            if (!RestartCmService(currentApi))
            {
                allPassed = false;
                return;
            }

            // Fail FRU Writes Remaining before starting test
            int writeCount = 0;
            while (bladeAssetInfoResponse.completionCode != CompletionCode.WriteFruZeroWritesRemaining &&
                writeCount < (AssetManagementConstants.fruWritesRemaining + 1))
            {
                bladeAssetInfoResponse = this.TestChannelContext.SetBladeAssetInfo(BladeId, string.Empty);

                if ((bladeAssetInfoResponse.completionCode != CompletionCode.Success)
                    && (bladeAssetInfoResponse.completionCode != CompletionCode.WriteFruZeroWritesRemaining))
                {
                    CmTestLog.Failure(string.Format("{0}: Command returned Completion Code {1} while trying to return {2} for blade {3}",
                        currentApi, Enum.GetName(typeof(CompletionCode), bladeAssetInfoResponse.completionCode),
                        "WriteFruZeroWritesRemaining", BladeId));
                    allPassed = false;
                    return;
                }
                writeCount++;
            }
            if (bladeAssetInfoResponse.completionCode != CompletionCode.WriteFruZeroWritesRemaining)
            {
                CmTestLog.Failure(string.Format("{0}: Command returned Completion Code {1} while trying to return {2} for blade {3}",
                        currentApi, Enum.GetName(typeof(CompletionCode), bladeAssetInfoResponse.completionCode),
                        "WriteFruZeroWritesRemaining", BladeId));
                allPassed = false;
                return;
            }

            CmTestLog.Info(string.Format("{0}: FRU Writes Remaining set to 0 for blade {1}", currentApi, BladeId));

            // Restore App.Config with Original Values
            if (!ConfigureAppConfig(fruWritesRemainingKeyValue, true))
            {
                CmTestLog.Failure(string.Format("{0}: App.Config cleanup failed", currentApi));
                allPassed = false;
                return;
            }

            // Restart CM Service
            if (!RestartCmService(currentApi))
            {
                allPassed = false;
                return;
            }

            // Verify SetBladeAssetInfo resets number of writes to default value after configuring App.Config : WorkItem(10174)
            // Set App.Config key "ResetMultiRecordFruWritesRemaining" to value "1"
            fruWritesRemainingKeyValue["ResetMultiRecordFruWritesRemaining"] = "1";
            if (!ConfigureAppConfig(fruWritesRemainingKeyValue, false))
            {
                CmTestLog.Failure(string.Format("{0}: Setting App.Config failed for KeyValue '{1},{2}'",
                    currentApi, fruWritesRemainingKeyValue.Keys.First(), fruWritesRemainingKeyValue.Values.First()));
                allPassed = false;
                return;
            }

            // Restart CM Service
            if (!RestartCmService(currentApi))
            {
                allPassed = false;
                return;
            }

            bladeAssetInfoResponse = this.TestChannelContext.SetBladeAssetInfo(BladeId, string.Empty);

            testPassed = ChassisManagerTestHelper.AreEqual(CompletionCode.Success, bladeAssetInfoResponse.completionCode,
                string.Format("{0}: Command resets number of writes to default value for blade {1}",
                currentApi, BladeId));
            allPassed &= testPassed;

            // Restore App.Config with Original Values
            if (!ConfigureAppConfig(fruWritesRemainingKeyValue, true))
            {
                CmTestLog.Failure(string.Format("{0}: App.Config cleanup failed", currentApi));
                allPassed = false;
                return;
            }

            if (!allPassed)
            {
                RestartCmService(currentApi);
                return;
            }

            // Starting test: SetBladeAssetInfo fails for attempting to set payload with 0 writes remaining
            // Set App.Config key "ResetMultiRecordFruWritesRemaining" to value "0"
            fruWritesRemainingKeyValue["ResetMultiRecordFruWritesRemaining"] = "0";

            if (!ConfigureAppConfig(fruWritesRemainingKeyValue, false))
            {
                CmTestLog.Failure(string.Format("{0}: Setting App.Config failed for KeyValue '{1},{2}'",
                    currentApi, fruWritesRemainingKeyValue.Keys.First(), fruWritesRemainingKeyValue.Values.First()));
                allPassed = false;
                return;
            }

            // Restart CM Service
            if (!RestartCmService(currentApi))
            {
                allPassed = false;
                return;
            }

            // Verify SetBladeAssetInfo should return WritFruZeroWritesRemaining after 256 iterations : WorkItem(4712)
            for (int callApiCount = 0; callApiCount < 255; callApiCount++)
            {
                bladeAssetInfoResponse = this.TestChannelContext.SetBladeAssetInfo(BladeId, string.Empty);

                if (bladeAssetInfoResponse.completionCode != CompletionCode.Success)
                {
                    CmTestLog.Failure(string.Format("{0}: Command returns Completion Code {1} on callApiCount {2} for blade {3} before {4}",
                        currentApi, Enum.GetName(typeof(CompletionCode), bladeAssetInfoResponse.completionCode),
                        callApiCount, BladeId, "WriteFruZeroWritesRemaining"));
                    allPassed = false;
                    return;
                }
            }

            bladeAssetInfoResponse = this.TestChannelContext.SetBladeAssetInfo(BladeId, string.Empty);

            testPassed = ChassisManagerTestHelper.AreEqual(CompletionCode.WriteFruZeroWritesRemaining, bladeAssetInfoResponse.completionCode,
                string.Format("{0}: Command returns Completion Code {1} after 256 calls for blade {2}",
                currentApi, "WriteFruZeroWritesRemaining", BladeId));
            allPassed &= testPassed;

            // Restore App.Config with Original Values
            if (!ConfigureAppConfig(fruWritesRemainingKeyValue, true))
            {
                CmTestLog.Failure(string.Format("{0}: App.Config cleanup failed", currentApi));
                allPassed = false;
                return;
            }

            // Set App.Config key "ResetMultiRecordFruWritesRemaining" to value "1"
            fruWritesRemainingKeyValue["ResetMultiRecordFruWritesRemaining"] = "1";
            if (!ConfigureAppConfig(fruWritesRemainingKeyValue, false))
            {
                CmTestLog.Failure(string.Format("{0}: Setting App.Config failed for KeyValue '{1},{2}'",
                    currentApi, fruWritesRemainingKeyValue.Keys.First(), fruWritesRemainingKeyValue.Values.First()));
                allPassed = false;
                return;
            }

            // Restart CM Service
            if (!RestartCmService(currentApi))
            {
                allPassed = false;
                return;
            }

            bladeAssetInfoResponse = this.TestChannelContext.SetBladeAssetInfo(BladeId, string.Empty);
            allPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Success, bladeAssetInfoResponse.completionCode,
                string.Format("{0}: FRU Writes Remaining reset for blade {1}", currentApi, BladeId));

            // Restore App.Config with Original Values
            if (!ConfigureAppConfig(fruWritesRemainingKeyValue, true))
            {
                CmTestLog.Failure(string.Format("{0}: App.Config cleanup failed", currentApi));
                allPassed = false;
                return;
            }

            // Restart CM Service
            if (!RestartCmService(currentApi))
            {
                allPassed = false;
            }

            return;
        }