public PublishedWorkbookResult PublishWorkbookWithEmbeddedCredentials(PublishWorkbookRequest publishRequest) { long fileSize = new System.IO.FileInfo(publishRequest.FilePath).Length; PublishedWorkbookResult result; if (fileSize > Constants.MaxFilePartSize || Path.GetExtension(publishRequest.FilePath).Equals(".twbx", StringComparison.OrdinalIgnoreCase)) { result = PublishMultiPart(publishRequest); } else { result = Publish(publishRequest); } // Add any tags to the newly-published workbook. if (result.IsSuccessful) { try { AddTagsToWorkbook(result.WorkbookId, publishRequest.Tags); } catch { // We swallow any errors here. } } return(result); }
private PublishedWorkbookResult PublishMultiPart(PublishWorkbookRequest publishRequest) { PublishedWorkbookResult publishedWorkbookResult = new PublishedWorkbookResult(publishRequest); try { // request a new upload session var session = this.InitiateFileUpload(publishRequest); // upload parts until there are no parts left to upload using (FileStream fs = new FileStream(publishRequest.FilePath, FileMode.Open, FileAccess.Read)) { while (fs.Position < fs.Length) { this.AppendToFileUpload(publishRequest, session, fs); } } // Finish file upload var workbook = this.FinishUploadAndPublishWorkbook(publishRequest, session); publishedWorkbookResult.IsSuccessful = true; publishedWorkbookResult.WorkbookId = workbook.id; publishedWorkbookResult.Uri = GetWorkbookUrl(workbook.contentUrl); } catch (Exception ex) { publishedWorkbookResult.IsSuccessful = false; publishedWorkbookResult.ErrorMessage = ex.Message; } return(publishedWorkbookResult); }
public workbookType FinishUploadAndPublishWorkbook(PublishWorkbookRequest publishRequest, fileUploadType session) { var uri = Endpoints.GetFinishPublishWorkbookUri(baseUri, publishRequest.SiteId, publishRequest.OverwriteExistingWorkbook, session.uploadSessionId, Path.GetExtension(publishRequest.FilePath).Replace(".", "")); tsRequest requestPayload = new tsRequest { Item = new workbookType { name = Path.GetFileNameWithoutExtension(publishRequest.FilePath), //showTabs = publishRequest.ShowSheetsAsTabs, //showTabsSpecified = publishRequest.ShowSheetsAsTabs, project = new projectType { id = publishRequest.ProjectId }, } }; var boundaryString = Guid.NewGuid().ToString().Replace("-", ""); string contentType = String.Format("multipart/mixed; boundary={0}", boundaryString); byte[] requestBody = PublishRequestBuilder.BuildFinishUploadBody(publishRequest.FilePath, requestPayload, boundaryString); ApiRequest apiRequest = new ApiRequest(uri, HttpMethod.Post, GetAuthToken(), headers: null, contentType: contentType, body: requestBody, timeoutSeconds: publishRequest.PublishingTimeoutSeconds); // Issue request. var errorMessage = String.Format("Failed to finish multipart publish workbook '{0}'", publishRequest.WorkbookName); tsResponse response = apiRequest.IssueRequest(errorMessage); return(response.GetWorkbook()); }
public fileUploadType InitiateFileUpload(PublishWorkbookRequest publishRequest) { var uri = Endpoints.GetFileUploadUri(baseUri, publishRequest.SiteId); ApiRequest request = new ApiRequest(uri, HttpMethod.Post, GetAuthToken(), headers: null, contentType: null, body: null, timeoutSeconds: publishRequest.PublishingTimeoutSeconds); var errorMessage = String.Format("Failed to retrieve session id for new upload to site '{0}'", siteName); tsResponse response = request.IssueRequest(errorMessage); // Extract site ID. fileUploadType uploadSession = response.GetFileUpload(); return(uploadSession); }
public fileUploadType AppendToFileUpload(PublishWorkbookRequest publishRequest, fileUploadType fileUploadSession, FileStream fileStream) { var uri = Endpoints.GetFileUploadUri(baseUri, publishRequest.SiteId, fileUploadSession.uploadSessionId); var boundaryString = Guid.NewGuid().ToString().Replace("-", ""); string contentType = String.Format("multipart/mixed; boundary={0}", boundaryString); byte[] requestBody = PublishRequestBuilder.BuildMultiPartAppendBody(publishRequest.FilePath, boundaryString, fileStream); var errorMessage = String.Format("Failed to append file part for upload to site '{0}' with upload session id '{1}'", siteName, fileUploadSession.uploadSessionId); ApiRequest request = new ApiRequest(uri, HttpMethod.Put, GetAuthToken(), headers: null, contentType: contentType, body: requestBody, timeoutSeconds: publishRequest.PublishingTimeoutSeconds); tsResponse response = request.IssueRequest(errorMessage); return(response.GetFileUpload()); }
protected PublishedWorkbookResult PublishWorkbook(IRestApiRequestor requestor, string pluginName, string workbookPath) { var workbookFilename = Path.GetFileName(workbookPath); Log.InfoFormat("Publishing workbook '{0}' to {1}..", workbookFilename, tableauConnectionInfo.Uri); var publishWorkbookRequest = new PublishWorkbookRequest(workbookPath) { PluginName = pluginName, SiteId = siteId, SiteName = tableauConnectionInfo.Site, ProjectId = projectId, ProjectName = publishingOptions.ProjectName, // Tag the workbook with the name of the plugin that generated it. Tags = new HashSet <string>(publishingOptions.Tags) { pluginName }, OverwriteExistingWorkbook = publishingOptions.OverwriteExistingWorkbooks, ShowSheetsAsTabs = true, PublishingTimeoutSeconds = tableauConnectionInfo.PublishingTimeoutSeconds }; postgresConnectionInfo.MatchSome(user => { publishWorkbookRequest.DatasourceUserName = user.Username; publishWorkbookRequest.DatasourcePassword = user.Password; }); PublishedWorkbookResult result = requestor.PublishWorkbookWithEmbeddedCredentials(publishWorkbookRequest); int attemptsMade = 1; while (!result.IsSuccessful && attemptsMade < WorkbookPublishingMaxAttempts) { Log.WarnFormat("Workbook publishing attempt #{0} failed. Retrying in {1} {2}..", attemptsMade, WorkbookPublishingRetryDelaySec, "second".Pluralize(WorkbookPublishingRetryDelaySec)); Thread.Sleep(1000 * WorkbookPublishingRetryDelaySec); result = requestor.PublishWorkbookWithEmbeddedCredentials(publishWorkbookRequest); attemptsMade++; } if (!result.IsSuccessful) { Log.ErrorFormat("Publishing of workbook '{0}' failed: {1} [{2} {3} made]", workbookFilename, result.ErrorMessage, attemptsMade, "attempt".Pluralize(attemptsMade)); } return(result); }
protected PublishedWorkbookResult PublishWorkbook(RestApiRequestor requestor, string pluginName, string workbookPath, bool overwriteExistingWorkbook = true) { var workbookFilename = Path.GetFileName(workbookPath); // Tag the workbook with the name of the plugin that generated it. logsharkRequest.WorkbookTags.Add(pluginName); Log.InfoFormat("Publishing workbook '{0}' to {1}..", workbookFilename, tableauConnectionInfo.ToUri()); var publishWorkbookRequest = new PublishWorkbookRequest(workbookPath) { PluginName = pluginName, SiteId = siteId, SiteName = tableauConnectionInfo.Site, ProjectId = projectId, ProjectName = logsharkRequest.ProjectName, DatasourceUserName = postgresConnectionInfo.Username, DatasourcePassword = postgresConnectionInfo.Password, Tags = logsharkRequest.WorkbookTags, OverwriteExistingWorkbook = overwriteExistingWorkbook, ShowSheetsAsTabs = true, publishingTimeoutSeconds = tableauConnectionInfo.PublishingTimeoutSeconds }; PublishedWorkbookResult result = requestor.PublishWorkbookWithEmbeddedCredentials(publishWorkbookRequest); int attemptsMade = 1; while (!result.IsSuccessful && attemptsMade < CoreConstants.WORKBOOK_PUBLISHING_MAX_ATTEMPTS) { Log.WarnFormat("Workbook publishing attempt #{0} failed. Retrying in {1} {2}..", attemptsMade, CoreConstants.WORKBOOK_PUBLISHING_RETRY_DELAY_SEC, "second".Pluralize(CoreConstants.WORKBOOK_PUBLISHING_RETRY_DELAY_SEC)); Thread.Sleep(1000 * CoreConstants.WORKBOOK_PUBLISHING_RETRY_DELAY_SEC); result = requestor.PublishWorkbookWithEmbeddedCredentials(publishWorkbookRequest); attemptsMade++; } if (!result.IsSuccessful) { Log.ErrorFormat("Publishing of workbook '{0}' failed: {1} [{2} {3} made]", workbookFilename, result.ErrorMessage, attemptsMade, "attempt".Pluralize(attemptsMade)); } return(result); }
private async Task <WorkbookPublishResult> PublishWorkbook(string projectId, CompletedWorkbookInfo completedWorkbookInfo, TableauServerRestApi restApi, IList <string> tags) { if (!completedWorkbookInfo.GeneratedSuccessfully) { return(new WorkbookPublishResult( completedWorkbookInfo.OriginalWorkbookName, new WorkbookPublishingException($"Workbook {completedWorkbookInfo.OriginalWorkbookName} was not generated successfully. Skipping publishing", completedWorkbookInfo.Exception))); } var publishWorkbookRequest = new PublishWorkbookRequest( completedWorkbookInfo.WorkbookPath, projectId, completedWorkbookInfo.FinalWorkbookName, overwriteExistingWorkbook: true) { Credentials = _dbCreds, }; WorkbookInfo workbookInfo; try { workbookInfo = await Retry.DoWithRetries <RestApiException, WorkbookInfo>( nameof(WorkbookPublisher), _logger, async() => await restApi.PublishWorkbook(publishWorkbookRequest)); _logger.LogDebug("Workbook `{publishedWorkbookName}` was published to Tableau Server as ID `{newWorkbookId}`", publishWorkbookRequest.WorkbookNameOnTableauServer, workbookInfo.Id); } catch (RestApiException ex) { var errorMessage = $"Failed to publish workbook `{completedWorkbookInfo.WorkbookPath}` after multiple retries. Exception was: {ex.Message}"; _logger.LogError(errorMessage); return(new WorkbookPublishResult(completedWorkbookInfo.OriginalWorkbookName, new WorkbookPublishingException(errorMessage))); } if (_publisherSettings.ApplyPluginProvidedTagsToWorkbooks && tags != null && tags.Count > 0) { await AddTagsToWorkbook(workbookInfo, tags, restApi); } return(new WorkbookPublishResult(workbookInfo.Name)); }
private PublishedWorkbookResult Publish(PublishWorkbookRequest publishRequest) { PublishedWorkbookResult publishedWorkbookResult = new PublishedWorkbookResult(publishRequest); try { var workbook = PublishWorkbook(publishRequest); publishedWorkbookResult.IsSuccessful = true; publishedWorkbookResult.WorkbookId = workbook.id; publishedWorkbookResult.Uri = GetWorkbookUrl(workbook.contentUrl); } catch (Exception ex) { publishedWorkbookResult.IsSuccessful = false; publishedWorkbookResult.ErrorMessage = ex.Message; } return(publishedWorkbookResult); }
public workbookType PublishWorkbook(PublishWorkbookRequest publishRequest) { // Construct URI & compose request payload. var uri = Endpoints.GetPublishWorkbookUri(baseUri, publishRequest.SiteId, publishRequest.OverwriteExistingWorkbook); tsRequest requestPayload = new tsRequest { Item = new workbookType { name = Path.GetFileNameWithoutExtension(publishRequest.FilePath), showTabs = publishRequest.ShowSheetsAsTabs, showTabsSpecified = publishRequest.ShowSheetsAsTabs, project = new projectType { id = publishRequest.ProjectId }, connectionCredentials = new connectionCredentialsType { name = publishRequest.DatasourceUserName, password = publishRequest.DatasourcePassword, embed = true, embedSpecified = true } } }; // Construct multipart request body using a boundary string to delimit sections. var boundaryString = Guid.NewGuid().ToString().Replace("-", ""); string contentType = String.Format("multipart/mixed; boundary={0}", boundaryString); byte[] requestBody = PublishRequestBuilder.BuildFileUploadBody(publishRequest.FilePath, requestPayload, boundaryString); // Issue request. var errorMessage = String.Format("Failed to publish workbook '{0}'", publishRequest.WorkbookName); ApiRequest apiRequest = new ApiRequest(uri, HttpMethod.Post, GetAuthToken(), headers: null, contentType: contentType, body: requestBody, timeoutSeconds: publishRequest.PublishingTimeoutSeconds); tsResponse response = apiRequest.IssueRequest(errorMessage); return(response.GetWorkbook()); }
private async Task <WorkbookPublishResult> PublishWorkbook(string projectId, CompletedWorkbookInfo completedWorkbookInfo, TableauServerRestApi restApi, IList <string> tags) { if (!completedWorkbookInfo.GeneratedSuccessfully) { return(WorkbookPublishResult.Fail( completedWorkbookInfo.OriginalWorkbookName, new WorkbookPublishingException($"Workbook {completedWorkbookInfo.OriginalWorkbookName} was not generated successfully. Skipping publishing", completedWorkbookInfo.Exception))); } var publishWorkbookRequest = new PublishWorkbookRequest( completedWorkbookInfo.WorkbookPath, projectId, completedWorkbookInfo.FinalWorkbookName, overwriteExistingWorkbook: true) { Credentials = _dbCreds, }; WorkbookPublishResult workbookPublishResult; try { var retryOnExceptionPolicy = Policy .Handle <RestApiException>() .WaitAndRetryAsync( new [] { TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(60), }, (exception, timeSpan, retryCount, context) => { _logger.LogDebug("Got an exception trying to publish workbook `{failedWorkbookName}`. This is retry number {retryCount}. Exception was: `{exceptionMessage}`", completedWorkbookInfo.FinalWorkbookName ?? "null", retryCount, exception?.Message ?? "null"); }); var handleExceptionPolicy = Policy <WorkbookPublishResult> .Handle <RestApiException>(ex => ex.IsTimeoutException) .FallbackAsync(WorkbookPublishResult.Timeout(completedWorkbookInfo.FinalWorkbookName)); workbookPublishResult = await retryOnExceptionPolicy .WrapAsync(handleExceptionPolicy) .ExecuteAsync(async() => { var workbookInfo = await restApi.PublishWorkbook(publishWorkbookRequest); return(WorkbookPublishResult.Success(completedWorkbookInfo.FinalWorkbookName, workbookInfo)); }); } catch (RestApiException ex) { var errorMessage = $"Failed to publish workbook `{completedWorkbookInfo.WorkbookPath}` after multiple retries. Exception was: {ex.Message}"; _logger.LogError(errorMessage); return(WorkbookPublishResult.Fail(completedWorkbookInfo.OriginalWorkbookName, new WorkbookPublishingException(errorMessage))); } if (workbookPublishResult.PublishState == WorkbookPublishResult.WorkbookPublishState.Success && _publisherSettings.ApplyPluginProvidedTagsToWorkbooks && tags != null && tags.Count > 0) { await AddTagsToWorkbook(workbookPublishResult, tags, restApi); } if (workbookPublishResult.PublishState == WorkbookPublishResult.WorkbookPublishState.Success) { _logger.LogDebug("Workbook `{publishedWorkbookName}` was published to Tableau Server as ID `{newWorkbookId}`", publishWorkbookRequest.WorkbookNameOnTableauServer, workbookPublishResult.PublishedWorkbookId); } else { _logger.LogDebug("Publishing attempt for workbook `{originalWorkbookName}` returned non-successful publishing status. Status: {publishingStatus}", publishWorkbookRequest.WorkbookNameOnTableauServer, workbookPublishResult.PublishState.ToString()); } return(workbookPublishResult); }
public PublishedWorkbookResult PublishWorkbookWithEmbeddedCredentials(PublishWorkbookRequest publishRequest) { PublishedWorkbookResult publishedWorkbookResult = new PublishedWorkbookResult(publishRequest); // Construct URI & compose request payload. var uri = Endpoints.GetPublishWorkbookUri(baseUri, publishRequest.SiteId, publishRequest.OverwriteExistingWorkbook); tsRequest requestPayload = new tsRequest { Item = new workbookType { name = Path.GetFileNameWithoutExtension(publishRequest.FilePath), showTabs = publishRequest.ShowSheetsAsTabs, showTabsSpecified = publishRequest.ShowSheetsAsTabs, project = new projectType { id = publishRequest.ProjectId }, connectionCredentials = new connectionCredentialsType { name = publishRequest.DatasourceUserName, password = publishRequest.DatasourcePassword, embed = true, embedSpecified = true } } }; // Construct multipart request body using a boundary string to delimit sections. var boundaryString = Guid.NewGuid().ToString().Replace("-", ""); string contentType = String.Format("multipart/mixed; boundary={0}", boundaryString); byte[] requestBody = PublishRequestBuilder.BuildRequestBody(publishRequest.FilePath, requestPayload, boundaryString); // Issue request. var errorMessage = String.Format("Failed to publish workbook '{0}'", publishRequest.WorkbookName); ApiRequest apiRequest = new ApiRequest(uri, HttpMethod.Post, GetAuthToken(), headers: null, contentType: contentType, body: requestBody, timeoutSeconds: publishRequest.publishingTimeoutSeconds); try { tsResponse response = apiRequest.TryIssueRequest(errorMessage); publishedWorkbookResult.IsSuccessful = true; publishedWorkbookResult.WorkbookId = response.GetWorkbook().id; publishedWorkbookResult.Uri = GetWorkbookUrl(response.GetWorkbook().contentUrl); } catch (Exception ex) { publishedWorkbookResult.IsSuccessful = false; publishedWorkbookResult.ErrorMessage = ex.Message; } // Add any tags to the newly-published workbook. if (publishedWorkbookResult.IsSuccessful) { try { AddTagsToWorkbook(publishedWorkbookResult.WorkbookId, publishRequest.Tags); } catch { // We swallow any errors here. } } return(publishedWorkbookResult); }