private async Task <DataPackage> GetDataPackageAsync(
            DataPackageType dataPackageType,
            ServiceManifest serviceManifest,
            StoreLayoutSpecification storeLayoutSpecification,
            TimeSpan timeout)
        {
            var checksumFile = storeLayoutSpecification.GetDataPackageChecksumFile(
                this.ApplicationTypeName,
                serviceManifest.ServiceManifestType.Name,
                dataPackageType.Name,
                dataPackageType.Version);
            var checksumTask = await this.ImageStoreWrapper.TryGetFromStoreAsync(checksumFile, timeout);

            return(new DataPackage(dataPackageType)
            {
                Checksum = checksumTask.Item1                                       /*checksumValue*/
            });
        }
        private async Task <ServiceManifest> GetServiceManifestAsync(
            ApplicationManifestTypeServiceManifestImport serviceManifestImport,
            StoreLayoutSpecification storeLayoutSpecification,
            TimeSpan timeout)
        {
            TimeoutHelper timeoutHelper       = new TimeoutHelper(timeout);
            string        serviceManifestFile = storeLayoutSpecification.GetServiceManifestFile(
                this.ApplicationTypeName,
                serviceManifestImport.ServiceManifestRef.ServiceManifestName,
                serviceManifestImport.ServiceManifestRef.ServiceManifestVersion);

            string checksumFile = storeLayoutSpecification.GetServiceManifestChecksumFile(
                this.ApplicationTypeName,
                serviceManifestImport.ServiceManifestRef.ServiceManifestName,
                serviceManifestImport.ServiceManifestRef.ServiceManifestVersion);

            var getServiceManifestTask = this.ImageStoreWrapper.GetFromStoreAsync <ServiceManifestType>(serviceManifestFile, timeoutHelper.GetRemainingTime());
            var getChecksumTask        = this.ImageStoreWrapper.TryGetFromStoreAsync(checksumFile, timeoutHelper.GetRemainingTime());

            await Task.WhenAll(getServiceManifestTask, getChecksumTask);

            timeoutHelper.ThrowIfExpired();
            ServiceManifestType serviceManifestType = getServiceManifestTask.Result;
            string checksum = getChecksumTask.Result.Item1;

            ServiceManifest serviceManifest = new ServiceManifest(serviceManifestType)
            {
                Checksum = checksum
            };

            List <Task <CodePackage> > codePackageTaskList = new List <Task <CodePackage> >();
            TimeSpan remainingTime = timeoutHelper.GetRemainingTime();

            foreach (CodePackageType codePackageType in serviceManifestType.CodePackage)
            {
                codePackageTaskList.Add(this.GetCodePackageAsync(codePackageType, serviceManifest, storeLayoutSpecification, remainingTime));
            }

            List <Task <ConfigPackage> > configPackageTaskList = new List <Task <ConfigPackage> >();

            if (serviceManifestType.ConfigPackage != null)
            {
                foreach (ConfigPackageType configPackageType in serviceManifestType.ConfigPackage)
                {
                    configPackageTaskList.Add(this.GetConfigPackageAsync(configPackageType, serviceManifest, storeLayoutSpecification, remainingTime));
                }
            }

            List <Task <DataPackage> > dataPackageTaskList = new List <Task <DataPackage> >();

            if (serviceManifestType.DataPackage != null)
            {
                foreach (DataPackageType dataPackageType in serviceManifestType.DataPackage)
                {
                    dataPackageTaskList.Add(this.GetDataPackageAsync(dataPackageType, serviceManifest, storeLayoutSpecification, remainingTime));
                }
            }

            List <Task> packageTasks = new List <Task>();

            packageTasks.AddRange(codePackageTaskList);
            packageTasks.AddRange(configPackageTaskList);
            packageTasks.AddRange(dataPackageTaskList);

            await Task.WhenAll(packageTasks);

            codePackageTaskList.ForEach(task => serviceManifest.CodePackages.Add(task.Result));
            configPackageTaskList.ForEach(task => serviceManifest.ConfigPackages.Add(task.Result));
            dataPackageTaskList.ForEach(task => serviceManifest.DataPackages.Add(task.Result));

            return(serviceManifest);
        }