/// <summary> /// Pushes an application to the cloud. /// <remarks> /// This method is only available on the .NET 4.5 framework. /// Calling this method from a Windows Phone App or a Windows App will throw a <see cref="NotImplementedException"/>. /// </remarks> /// </summary> /// <exception cref="NotImplementedException"></exception> /// <param name="appGuid">Application guid</param> /// <param name="appPath">Path of origin from which the application will be deployed</param> /// <param name="startApplication">True if the app should be started after upload is complete, false otherwise</param> public async Task Push(Guid appGuid, string appPath, bool startApplication) { if (appPath == null) { throw new ArgumentNullException("appPath"); } IAppPushTools pushTools = new AppPushTools(appPath); int usedSteps = 1; // Step 1 - Check if application exists this.TriggerPushProgressEvent(usedSteps, "Checking if application exists"); RetrieveAppResponse app = await this.Client.Apps.RetrieveApp(appGuid); usedSteps += 1; // Step 2 - Compute fingerprints for local files this.TriggerPushProgressEvent(usedSteps, "Calculating file fingerprints ..."); Dictionary <string, List <FileFingerprint> > fingerprints = await pushTools.GetFileFingerprints(this.Client.CancellationToken); if (this.CheckCancellation()) { return; } usedSteps += 1; // Step 3 - Compare fingerprints of local files with what the server has this.TriggerPushProgressEvent(usedSteps, "Comparing file fingerprints ..."); HashSet <string> neededFiles = await this.FilterExistingFiles(fingerprints); if (this.CheckCancellation()) { return; } usedSteps += 1; // Step 4 - Zip all needed files and get a stream back from the PushTools this.TriggerPushProgressEvent(usedSteps, "Creating zip package ..."); using (Stream zippedPayload = await pushTools.GetZippedPayload(neededFiles, this.Client.CancellationToken)) { if (this.CheckCancellation()) { return; } usedSteps += 1; // Step 5 - Upload zip to CloudFoundry ... this.TriggerPushProgressEvent(usedSteps, "Uploading zip package ..."); List <FileFingerprint> fingerPrintList = fingerprints.Values.SelectMany(list => list).Where(fingerprint => !neededFiles.Contains(fingerprint.FileName)).ToList(); await this.UploadBits(appGuid, zippedPayload, fingerPrintList); if (this.CheckCancellation()) { return; } usedSteps += 1; } if (startApplication) { // Step 6 - Start Application UpdateAppRequest updateApp = new UpdateAppRequest() { State = "STARTED" }; UpdateAppResponse response = await this.UpdateApp(appGuid, updateApp); if (this.CheckCancellation()) { return; } usedSteps += 1; } // Step 7 - Done this.TriggerPushProgressEvent(usedSteps, "Application {0} pushed successfully", app.Name); }
/// <summary> /// Pushes an application to the cloud. /// <remarks> /// This method is only available on the .NET 4.5 framework. /// Calling this method from a Windows Phone App or a Windows App will throw a <see cref="NotImplementedException"/>. /// </remarks> /// </summary> /// <exception cref="NotImplementedException"></exception> /// <param name="appGuid">Application guid</param> /// <param name="appPath">Path of origin from which the application will be deployed</param> /// <param name="startApplication">True if the app should be started after upload is complete, false otherwise</param> public async Task Push(Guid appGuid, string appPath, bool startApplication) { if (appPath == null) { throw new ArgumentNullException("appPath"); } IAppPushTools pushTools = new AppPushTools(); int usedSteps = 1; // Step 1 - Check if application exists this.TriggerPushProgressEvent(usedSteps, "Checking if application exists"); RetrieveAppResponse app = await this.Client.Apps.RetrieveApp(appGuid); usedSteps += 1; // Step 2 - Compute fingerprints for local files this.TriggerPushProgressEvent(usedSteps, "Calculating file fingerprints ..."); Dictionary <string, List <FileFingerprint> > fingerprints = await pushTools.GetFileFingerprints(appPath, this.Client.CancellationToken); if (this.CheckCancellation()) { return; } usedSteps += 1; // Step 3 - Compare fingerprints of local files with what the server has this.TriggerPushProgressEvent(usedSteps, "Comparing file fingerprints ..."); string[] neededFiles = await this.FilterExistingFiles(fingerprints); if (this.CheckCancellation()) { return; } usedSteps += 1; // Step 4 - Zip all needed files and get a stream back from the PushTools this.TriggerPushProgressEvent(usedSteps, "Creating zip package ..."); using (Stream zippedPayload = await pushTools.GetZippedPayload(appPath, neededFiles, this.Client.CancellationToken)) { if (this.CheckCancellation()) { return; } usedSteps += 1; // Step 5 - Upload zip to CloudFoundry ... this.TriggerPushProgressEvent(usedSteps, "Uploading zip package ..."); UriBuilder uploadEndpoint = new UriBuilder(this.Client.CloudTarget.AbsoluteUri); uploadEndpoint.Path = string.Format(CultureInfo.InvariantCulture, "/v2/apps/{0}/bits", appGuid.ToString()); List <FileFingerprint> fingerPrintList = fingerprints.Values.SelectMany(list => list).ToList(); string serializedFingerprints = JsonConvert.SerializeObject(fingerPrintList); SimpleHttpResponse uploadResult = await this.UploadZip(uploadEndpoint.Uri, zippedPayload, serializedFingerprints); if (this.CheckCancellation()) { return; } usedSteps += 1; } if (startApplication) { // Step 6 - Start Application UpdateAppRequest updateApp = new UpdateAppRequest() { State = "STARTED" }; UpdateAppResponse response = await this.UpdateApp(appGuid, updateApp); if (this.CheckCancellation()) { return; } usedSteps += 1; } // Step 7 - Done this.TriggerPushProgressEvent(usedSteps, "Application {0} pushed successfully", app.Name); }